数字在机器中都用二进制来进行存储,有符号数则有原码、反码和补码三种表示方式
这三种表示方式里,最高位都代表的是符号位,1代表负数,0代表正数
1 .源代码中的一个源代码是被转换为二进制数而不做修改的数字,第一位是符号比特
8的源代码: 0000 1000
-8的源代码: 1000 1000
2 .反转正数的反转是自身
8的源代码: 0000 1000
8的反码: 0000 1000
负符号是原符号除了符号比特之外,其他所有的比特都以比特为单位反转
-8的源代码: 1000 1000
-8的反码: 1111 0111
3 .补数加补数是自身
8的源代码: 0000 1000
8的反码: 0000 1000
8的补数: 0000 1000
负数的补数是在反码上加1 (运算时包含编码位)。
-8的源代码: 1000 1000
-8的补数: 1111 0111
-8的补数: 1111 1000
正数的原反补码都是相等的,负数的原反补码是相互转换得到的
4 .补数存在的意义在机器中,数值一律用补码来表示和存储。
使用补码的原因:
使用补数,在统一处理符号位和数值字段的两个数字之间进行加减运算时,可以将数字读入CPU进行计算。 另一方面,CPU中只有加法器,为了将减法变换为加法,使用补数将加减运算统一为举个例子
计算8 - 5
因为CPU里只有加法器,所以把8 - 5变换成8(-5 )进行计算
(8) )。
8的源代码: 0000 1000
8的反码: 0000 1000
8的补数: 0000 1000
(-5 ) )。
-5的源代码: 1000 0101
-5的反码: 1111 1010
-5的补数: 1111 1011
8-5=8(-5 )
0000,1000
1111 1011
-----------------
0000 0011
如果0000 0011的符号位为0,则表示正数,原始的反补数全部相同,转换为十进制后为3
代码测试
int main () {int i=8; int j=-5; int m=i j; printf(%d(n ),m ); 返回0; }获得结果
让我们来看看利用调试存储在内存中的数据
首先确认存储在I地址中的数据
看到他储存在内存中的是08 (这里是十六进制),转换成二进制就是0000 ) 1000 ) (8的补数)。
然后,我们来看看j地址中存储的数据
这里保存的是fb转换为二进制的1111 1011。 (这里是-5的补数。
因此,数据以补数形式显示和保存在机器中,补数的出现也容易计算