二进制的话不用多说,就是0和1的组合,每个0和1占据一个bit位。
1个字节有8个bit位。我们选择数字5,并以java为例:
byte类型的5占据一个字节,那么在计算机中5存在的形式就是00000101。
short类型的5占据两个字节,其在计算机中存在的形式为00000000 00000101。
那么我们再以byte为例,如果抛开正负,也就是抛开符号来谈的话。byte的取值范围是00000000~11111111。
直接换算成10进制的话就是0到255。但是我们都知道,byte的取值范围其实是 -128~+127。
这是因为在计算机中,一个数据的第一个bit位,也就是最左边的bit位其实是符号位。0代表正数,1代表负数。我们可以理解为第一个bit位不参与运算。那么byte类型的取值范围其实就变成了±(000 0000~~111 1111,注意这里只有7个bit位,因为符号位被我省去)
这样算的话,取值范围就变成-127~+127。那么-128哪去了呢?玄机就在000 0000。我们给其补上符号位0和1。得到两个二进制码0000 0000和1000 0000。
其中0000 0000即十进制的0,而1000 0000就是十进制的-128(涉及到二进制的原码,反码,补码,这里不理解的可以百度)。
一定要注意的是,同样的二进制码,在不同的数据类型中代表的数字不一定相同。
如1000 0001,在byte类型中,由于只有1个字节,也就是8个bit位。所以左边第一个bit位1代表的是符号位,不参与运算,只代表这个数是负数。数值是-127。
而在short类型中,由于占用两个字节,所以1000 0001其实就是0000 0000 1000 0001,
最左边bit位为0,后面所有bit位参与运算,最终结果为129。
关于基本数据类型向下转换;
@org.junit.Test
public void test8() {
short s = 32641;
byte i =(byte) s;
System.out.println(i);
}
Short类型的32641在计算机中的二进制码为0111 1111 1000 0001
在向下转型的过程中,由于byte类型只占一个字节8个bit位,所以只能接收到后边8位,也就是1000 0001。对应的十进制就是-127。