整型字面值与进制运算之间的关系

何为字面值?说白了就是一眼看上去的内容值,比如下面的分别用几个不同进制(二进制、八进制、十进制、十六进制)表示法表示的自面值信息

  1. 二进制表示:int i = 0b111010110;其实0b111010110就是字面值
  2. 八进制表示:long l3 = 0123;其实0123就是字面值
  3. 十进制表示:long l2 = 225;其实225就是字面值
  4. 十六进制表示:long l5 = 0x12af;其实0x12af就是二进制值

好了上面已经描述了自面值的概念,那么整型自面值就是整数类型的字面值喽(哈哈没有开玩笑)。下面说明整型字面值与不同进制之间的关系。

一、十进制

地球上被人类采用的通用的数值表示方式,比如再正常不过的0、2、5、32、100等等;我们眼睛看到的数值就是表示其真实的值,不像其它进制表示方式,我们眼睛看到的值并不一定是其真实的值,所以我们人类一般采用十进制表示方式(10进制比较诚实,人类比较懒呗)。

二、二进制

计算机唯一能识别的只有0和1,而这里的0和1就是二进制,绝对不是指数字的0和1,这也是比较容易引起混淆的地方;

举个常见的例子:我们生活中常用的算账用的计算器,我们输入100+30然后按完“=”号后,计算器屏幕上面会显示两个数相加后的结果130, 这个过程我输入的数字(100、30)或者按的按钮(+、=)和最后输出的130这几个动作,都是我们人类自己能很好识别的;我们输入十进制数字。然后计算器接收后是不识别的,实际上这个过程经历了非常复杂的转换过程:

1)、十进制数会被转换成二进制,也就是把100转化成只有0和1组成的一串数字(1100100);
    30转换成二进制数字(11110)
2)、然后计算器把转换后的两个二进制数进行相加,最终得到二进制结果:10000010(130);
    实际上二进制之间加法很简单,只需要把两个二进制数右对齐,然后上下两个数(0或者1)相加,相加的结果(和)逢2进1就行了。

二、八进制

除了人类使用的10进制、计算机使用的二进制外,其实还有八进制(以0开头,以8为基数运算)

8进制数字的范围是0~7,也就是说用8进制形式标示数值时,需要用0开头,
并且标示数值串中只能包含0~7之间的数字,例如:
int i = 0123;
int m = 01354;
int n =0238;(不合格)

8进制表示的数值怎么计算成人类识别的10进制呢,其实非常简单,只需要按照规则来计算就行了,
我们就拿int i = 013;这个变量定义来讲,一共三个数字(0、1、3);那么我们从最右侧3用索引数数就是(0[2]、1[1]、3[0]),方括号中为从右侧开始计数的索引。

比如013=3*8的0次方+1*8的1次方=3+8=11;

三、十六进制

16进制的数字范围是0~15,而阿拉伯数字只有0~9,所以分别用A~F(a~f)替代数字10~15;也就是说用16进制表示的数值串中只能包括0~9和a|A~f|F;十六进制表示方式就是以0X开头,以16为基数进行运算

可以参照上面的八进制计算规则,long l5 = 0x12af;定义的变量用十进制表示方法就是:
0x12af表示的十进制数为:15*16的0次方+10*16的1次方+2*16的2次方+1*16的3次方=4783

注、用二进制表示十进制

从jdk7开始,我们可以直接定义变量的时候可以用二进制表示十进制字面值,不过必须使用0b或0B作为数值的前缀。

比如:int x = 0b1010;
其实x的真实值是二进制1010运算十进制后的值10.

int u = 0B111010110;
其实u的真实值是二进制111010110运算十进制后的值470.