关于「原码、反码、补码」
关于原码反码补码、按位取反、求相反数的计算原理等,一定要熟悉且清晰。
原码、反码、补码
本文例子均为32位int整形变量
基本概念
在计算机中,整数都是以其补码形式进行存储和计算的。
正/负数的补码
首先,原码/反码/补码的最高位为符号位,1
代表负数,0
代表正数
正数的原码、反码、补码均相同
负数的反码是在原码的基础上,除了符号位不变,其余数值位,逐个取反(~),即为原码的反码
负数的补码是在反码的基础上加1,即为原码的补码
INT_MIN=0b1000 0000 0000 0000 0000 0000 0000 0000
反码:0b1111 1111 1111 1111 1111 1111 1111 1111
补码:0b1000 0000 0000 0000 0000 0000 0000 0000
因此,负数的二进制表示为其 「补码形式」
除了符号位,其余按位取反后,加1即为补码
相反数的补码
注意:符号位也取反,符号 为按位取反
~
的意思
①「相反数的反码和 的反码互为相反数」
② 正数的三码相同
③ 负数的补码等于反码加1
若 是负数
若 是正数,同理,
其实
无论正数还是负数,其相反数的补码都可以表示为
INT_MIN = 0x8000 0000
1 | INT_MIN |
经过计算发现 -INT_MIN
仍然是0x8000 0000
,是其本身
使用补码计算
例子1
计算机实际上只会执行加法计算
例如:计算 时,实际上为
1 | 58原码 ==>0000 0000 | 0000 0000 | 0000 0000 | 0011 1010 |
例子2
任何 变量 减去INT_MIN
一定小于0
计算:
58 - INT_MIN
INT_MIN=-2147483648
答案是-2147483590
计算过程如下:
58 + (-INT_MIN)
先转化为补码表示
1 | 58补码 = 0b0000 0000 0000 0000 0000 0000 0011 1010 |
然后相加,为 0b1000 0000 0000 0000 0000 0000 0011 1010=-2147483590
总结
计算机中,整数都是以其补码形式进行存储和计算的
正数的三码相同
负数的反码等于除符号位外按位取反。负数的补码等于反码加1(符号位同样不变)
相反数的反码和 的反码互为相反数。
相反数的补码,等于 补码的每一位按位取反,再加1。即
参考资料
📔博文图谱
提及本博文的链接