计算机中带符号的整数都是用的二进制的补码,这点我们需要明确。那为什么计算机存储要用补码而不直接用原码,其实就是为了计算机自己方便运算,后面会介绍。
计算机中表示-128 ~ 127的格式如下:
0000 0000 0
0000 0001 1
…… ……
0111 1111 127
1000 0000 -128
1000 0001 -127
…… ……
1111 1111 -1
上面的二进制都是补码,它们是在计算机中的表示形式。
因为最高位是符号位,0表示正数,1表示负数
正数的补码和原码,反码相同,所以我们会很容易的知道 0111 1111 是127
那负数呢
比如1111 1111为什么是-1而不是-127
我们知道1111 1111 是补码,如果我们想要知道它的真实身份,就需要求它的原码
1111 1111 减 1得到反码 1111 1110 反码除了符号位 其余按位取反 得到1000 0001 现在我们就知道原来它的真实身份是-1
这里有一个特殊情况就是 1000 0000 为什么是-128 我们会发现求它的原码好像不好求 会出现错误 其实我们可以反证得到其实1000 0000 的补码和原码是一样的
这里就会有人问1000 0000 不是表示 -0 吗?也许你是对的,但是我们已经有0000 0000 表示0 了 ,0的正负其实是没有意义的,所以我们就无须弄两个0出来,所以1000 0000 的最高位既是符号位也是数值位 表示 -128, 这是个特殊。
其实一个字节表示的数是256个 而-128 ~ 127 刚好是256个 说到这里大家有没有理解呢?
现在我们再说说为什么计算机要用补码表示一个数,我们举个例子
如果计算机用原码表示数据 则 -1 = 1000 0001 1 = 0000 0001
-1 + 1 = 1000 0001 + 0000 0001 = 1000 0010 = -2 ??? 不是等于0 吗,怎么会是-2 ,这就是计算机用原码表示时进行加减运算出的错误
我们再看看补码的形式 -1 = 1111 1111 1 = 0000 0001
-1 + 1 = 11111111 + 0000 0001 = 0000 0000 =0 我们可以看到结果是正确的
我们再举个例子 如果计算机用原码表示数据 1 = 0000 0001 -2= 1000 0010
1 + (-2)= 0000 0001 + 1000 0010 = 1000 0011 = -3 这显然是错的
如果计算机用补码表示数据 1 = 0000 0001 -2 = 1111 1110
1 + (-2)= 0000 0001 + 1111 1110 = 1111 1111 = -1
我们知道1111 1111它其实是补码,它表示的就是 -1
写到这里大家应该已经大致明白我的意思了,当然还有一些比较特殊的情况需要大家自己琢磨,而且由于自己水平有限,可能有些不正确的说法,还需要大家指出批评。