真值
计算机机器数真正的值称为真值。因为机器数的最高位是符号位,所以我们在计算真值的时候要分区分开。 比如机器数10000101,单纯作为一个二进制数,我们转换为十进制是133。但是其真值是不计算符号位的,其最高位的1表示"-"。所以10000101的真值为-5。
下面的讨论以字长8为例
原码
原码=符号位+真值。比如:
[+5]原码=0 000010
[-5]原码=1 000010
原码表示与真值对应直观,而且转换也简单,但直接计算会出问题,需要一系列的转换,详细参考:www.imooc.com/article/213…
反码
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。但因为进位会导致问题。详细参考:www.imooc.com/article/213…
补码
补码:正数的补码与原码相同,负数的补码等于其反码的末位加1。
+0 和 -0 的表示,在原码和反码都有两种形式,但是补码却只有一种:
[+0]=[0000 0000]原=[0000 0000]反=[0000 0000]补
[-0]=[1000 0000]原=[1111 1111]反=[0000 0000]补
这样10000000本来是表示-0的就可以省出来表示一个其他的数了,当前用来表示-128(因为正常已经可以表示到-127了),所以这才有了short类型的表示范围:-128~127
扩展
对于16位数据,signed short -1 转成 unsigned short 为 65535 是因为:
-1的原码为:10000000 00000001,对应的补码是:补码是 11111111 11111111
而unsigned short 65535的补码也是11111111 11111111 因此在二进制表示上是一致的!
11111111 11111111 = 2的16次方 - 1 = 65536 - 1 = 65535
参考:short si=–32768; unsigned short usi=si; 输出usi是多少? - Milo Yip的回答 - 知乎 www.zhihu.com/question/28…