有符号整数在计算机中的表示方法

 数据在计算机中都是以0和1来存储的,我们的有符号数也不例外,我们这次就要明白有符号数是以什么的规律存储的,又为什么用这种规律存储的

 当我们要存储一个有符号数字的时候,我们不仅要把数字的大小存储起来,同时还要存储它的符号(正或负),所以我们的有符号数字可以这样存储:用来表示数字正负的符号位+用来表示数字大小的数据位,这便引出了我们要说到的原码

  • 原码
     原码是一种计算机中对数字的二进制定点表示方法, 原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1,其余位表示数值的大小
    那我们就用原码来表示一下数据吧(8位)

 +67:image
 -25 :

 +67为正数,所以我们最高位为0,然后我们将67转为二进制就是1000011,我们将符号位和数据位合起来就得到了图片中的01000011,-25同理

需要注意的是在原码的表达方式中,0有两个编码值,我称之为+0和-0,+0是00000000,-0是10000000,所以8位原码能表达的有符号数范围为-127~+127

 对于数值的表示我们做完了,那是不是代表这个方式能直接用呢?不是的,我们还要看这样的表达方式在运算的时候会不会出错,在这里我只使用简单的加减法进行证明:
01000011+00011001+67加+25,通过二进制的加法,我们可以得到答案为01011100为+92,是正确的
11000011+10011001-67加-25,通过二进制的加法,我们可以得到答案为01011100为+92,很明显是错误的
01000011+10011001+67加-25,通过二进制的加法,我们可以得到答案为11011100为-92,很明显也是错误的
 所以我们可以得到一个显而易见的结论,原码适合数字的表示,但是在进行运算的时候并不能得到正确的答案,所以我们是不能用原码的形式来存储数据的,于是我们要用别的规则了,这个规则叫反码

  • 反码
     如果是正数,则反码表示方法和原码一样;如果是负数,符号位不变,其余各位取反,则得到这个数字的反码表示形式. 补码是计算机表示数据的一般方式,其规则为:如果是整数,则表示方法和原码一样.如果是负数,则将数字的反码加上1(相当于将原码数值位取反然后在最低位加1)

 同样的,我们使用反码的方式把刚刚的数字再表示一次:
+67:
-25 :
 正数和原码一样,而反码是需要将原码中的数据位都要取反的,0011001取反为1100110,所以我们得到了在反码的规则下-25的二进制

同样需要注意的是在反码的表达方式中,0有两个编码值,我称之为+0和-0,+0是00000000,-0是11111111,所以8位反码能表达的有符号数范围也是-127~+127

 同样的,我们需要看在这个规则下的运算结果是否正确:
01000011+00011001+67加+25,通过二进制的加法,我们可以得到答案为01011100为+92,是正确的
10111100+11100110-67加-25,通过二进制的加法,我们可以得到答案为10100010,我们将其转为原码的形式为11011101为-93,很明显是错误的,但是我们能发现和标准答案-92已经很接近了
01000011+11100110+67加-25,通过二进制的加法,我们可以得到答案为00101001为+41,很明显也是错误的,但是我们发现和正确答案+42也是非常接近的
 通过上述的观察,我们发现反码也是不能用来存储的,因为运算结果仍然是不对的,但是我们发现在有负数加入运算的时候,运算结果只和正确答案相差1,所以我们是否可以在反码的规则上增加一条规则,让运算结果正确,加减法统一处理呢,是可以的,这个就叫补码

  • 补码
     正整数的补码是其二进制表示,与原码相同,而负整数的补码是将其原码除符号位外的所有位取反后加1

 +67:image
 -25 :image
 正数和原码一样,而反码是需要将原码中的数据位取反再加一个1的,0011001取反为1100110,然后我们再+1得1100111,所以我们得到了在补码的规则下-25的二进制

在补码的表达方式中,0只有一个编码值,之前的+0和-0都是00000000,所以8位补码能表达的有符号数范围为-128~+127

 同样的,我们继续进行论证:
01000011+00011001+67加+25,通过二进制的加法,我们可以得到答案为01011100为+92,是正确的
10111101+11100111-67加-25,通过二进制的加法,我们可以得到答案为101000100,我们将其转为原码的形式为11011100为-92也是正确的
01000011+11100111+67加-25,通过二进制的加法,我们可以得到答案为00101010为+42很明显也是正确的


原码是表示数据最直观的,但是结果也是最不准确的,而补码虽然不直观,但是存储在电脑中是最合适的,所以我们的有符号整数在电脑中就是以补码的形式存储的,使用补码,可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理,对电脑来说是一个很好的选择

posted @ 2020-07-01 15:45  时_光  阅读(2065)  评论(0编辑  收藏  举报