C/C++编程

原码、反码、补码

2016-09-05  本文已影响75人  Sivin

原码、反码、补码

标签(空格分隔): C语言


一个数在计算机中式以二进制的形式存在。通常我们称为机器数机器数是有符号的,在计算机中最高位存放符号位。其中正数的符号位为0,负数的符号位为1

原码:符号位加上其余位的真值的绝对值

这里以字长位 8 位的机器为例

例如:3的原码就是 0000 0011 
     -3的原码就是 1000 0011

反码:对于正数而言,反码就是原码,对于负数而言,反码是除号位之外,其余各位取反

例如:3的反码是:0000 0011
     -3的反码是:1111 1100

由于计算机在用原码参与计算时需要考虑到符号位,效率比较低下,因此在计算机中,负数通常是以补码的形式存放在内存中的。
补码:对于正数而言,原码,反码,补码,是一致的,对于负数而言,补码等于反码加一

例如:3的补码是:0000 0011
    -3的补码是:1111 1101

计算 3-3

0000 0011  + 1111 0100 = 0000 0000 =0

计算 5-7

0000 0101 + 1111 1001 = 1111 1110------> -2的补码

思考:不知道大家想过这个问题没有?为什么对于字长为8位的数值类型存储范围为什么是 -128到127呢?

答:在计算机中的数值是以补码的形式存放的,因为使用原码和反码存放时会出现一个1000 0000 我们叫负零,我们认为负零这个数多余的,我们想让0的表示是唯一的。而补码正好解决了这个问题,当-127的补码和-1的补码相加时得到的补码正好是在原码表示下的负零,于是我们将这个数值成为-128扩充了一位。这样解决了,计算的效率问题,也解决了零编码的唯一性问题,还增加了数值存储的范围。

补码如何转成原码

符号位不动,其他位求反,最后整个数加一,得到原码

-2的补码是:1111 1110
原码是:1000 0010;
上一篇下一篇

猜你喜欢

热点阅读