原码、反码、补码
标签(空格分隔): 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;
网友评论