C语言——原码,反码,补码

原码(true form)


原码 (true form)是一种计算机中对数字的二进制定点表示方法

最高位为符号位,0为正数,1为负数

非符号位是该数字的绝对值的二进制

原码0000 0001        (1)D

原码1000 0001        (-1)D


反码


8位(1字节)二进制原码转反码

正数的反码与原码一致

正数

原码0000 0001        (1)D

反码0000 0001       (1)D

负数转反码,将数字位按位取反(原来为0变为1,原来为1变为0),符号位不变

负数

原码1000 0001        (-1)D

反码1111 1110        (-1)D


补码


8位(1字节)二进制原码转补码

正数的补码与原码一致

正数

原码0000 0001        (1)D

补码0000 0001        (1)D

负数转补码,将数字位按位取反后再加1,即将其反码加1

负数

原码1000 0001        (-1)D

补码1111 1111        (-1)D


小知识1


给出一个8位二进制数字1001 1100

原码1001 1100

补码1110 0100

快速将负数原码转化为补码的方法

从右向左转换,第一个1之前的0都不变,还写为0,第一个1也不变,还写为1,第一个1后面的1和0都变为相反的数,即0变1,1变0,最后一位(最高位/符号位)不变

快速将负数补码转换为原码的方法

从左向右转换,第一位(最高位/符号位)不变,最后一个1之前的1和0都变为相反的数,即0变1,1变0,最后一个1不变,还写为1,最后一个1之后的0也不变,还写为0


小知识2


一、原码,反码,补码只是二进制的三种表现方式

正数和负数都有原码,反码,补码

二、计算机里都是以补码的形式存储数据

三、负数反码转换成成原码的方法:符号位不变,其余位取反

四、0000 0101为八位二进制数字,他的最低位为第零位,最高位为第七位,一共八位,

占用8bit即1字节的内存

五、补码的形式便于运算

cpu只有加法器,没有减法器,所以计算机计算减法时,是把减法转化为加法。

例如要计算5 - 5,要转化为5 + (-5)来计算

1)用源码计算:0000 0101 + 1000 0101 = 10001010 = -10(D)        (结果不对)

2)用反码计算:0000 0101 + 1111 1010 = 1111 1111

1111 1111为反码,转换成原码为1000 0000

1000 0000 = -0

这样0就有了两种表达方式:1000 0000    (-0)D    和    0000 0000    (+0)D

这样减少了可表示数字的数量

3)用补码计算:0000 0101 + 1111 1011 = 1 0000 0000(超出第七位。高位溢出,即第八位舍去),得出结果为0,正确。

而且补码形式0只有一种表达方式,相比反码增加了可表示数字的数量


你可能感兴趣的:(C语言,c语言)