本篇涉及计算机基础知识:原码、补码、java的字节
今天看孙卫琴老师的《JAVA面向对象编程 第2版》时,有一个例子:
byte b = (byte)129
b = -127
解释是:
byte类型的取值范围在(~128-127)。(byte)表示把129强制转换为byte类型。byte类型在内存中只占一个字节(8位),而129的二进制形式为:0000 0000 0000 0000 0000 0000 1000 0001(int类型占4个字节)。进行强制类型转换,截取后8位,结果为1000 0001。而byte类型的1000 0001表示-127。
为什么是-127?
众所周知,计算机中有原码、补码、反码。了解计算机的历史后,刚开始只有原码。分正负号表示。但对于0,既有0000 0000(+0),又有1000 0000(-0)。计算机中不可能用两个不同二进制数来表示同一个整数。所以就出现了补码。补码可以解决这个问题。更深入了解的可以直接去搜。
而对于补码,正数的补码是其本身,负数的补码是它的绝对值取反再+1。所以对于-127,它的绝对值的二进制表示为0111 1111,每个位都取反,是1000 0000,然后加上1,就变成了1000 0001。
怎么从补码得到原码,或怎么从-127得到它的原码表示?
如果该补码的符号位为0,表示正数,补码和原码相同。
如果该补码的符号位为1,表示负数,按照原码转补码的方式,即可从补码转原码。
比如上面例子反过来,已知补码是1000 0001,那么首先可知它是负数。取绝对值为0000 0001,按位取反为1111 1110,然后加上1,就变成了1111 1111。
完。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)