计算机可以识别0和1, 1个字节等于8位(1Byte=8bit)。
无符号整型1表示为00000001,2表示为00000010,3表示为00000011, ..., 最大11111111。 无符号的数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。无符号的整数根本就没有原码、反码和补码。
只有有符号的整数才有原码、反码和补码的!其他的类型一概没有。
不能用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的方法。
因为2^7*2还是256个数, 但是 0000 0000 和 1000 0000 是一个数 这样就能表示 255个数。
负整数在计算机中是以补码形式储存的,但是由于正整数的补码和反码一样,所以可以统称有符号整数按补码存储。
32bit系统中 0x8000 0000 ~ 0xFFFF FFFF 正好对应着 -2^31 ~ -1, 同时可以发现所有这些负数的最高位都是1。
所以在有符号整型数对应的储存码的最高位 可以指示出来 数的正负,但是剩余31 对应的二进制值并不是这个负数的绝对值。
其实一个负数补码对应的值是 -2^31 + (除了最高位,剩下位的值)
比如 0x8000 0000 对应的数 是 -2^31 + 0 = -2^31; 而0xFFFF FFFF 对应的数是 -2^31 + (-2^31 - 1) = -1
补码的意义在于: 1) 0不能对应两个码; 2)减法变加法。
补码的计算公式:
B2T = Binary to Two's complement
根据上式,一个由w bits的位向量表示的补码可以这样计算:
1)对于正数,即为0 - (w-2)位的加权和(因为此时最高有效位,即第w-1位,为0,故其实是剩余w-2位的加权和,可见,与原码计算方法一致)
2)对于负数,最高有效位除表示符号位外,也参与计算,其权重为-2^(w-1),该值再与剩余w-2位的加权和求和,从而得到最终补码值
参考博客:
http://blog.youkuaiyun.com/liuyangsyouxiang/article/details/6050525
http://blog.youkuaiyun.com/slvher/article/details/8713487