本篇文章介绍了原码、反码和补码的概念,其次介绍了正负数的原码、反码及补码的转换。
机器数与真值
机器数
一个数的二进制表现形式。其中二进制最高位表示正负,1表示负数,0表示正数。比如
5(十进制)-> 00000101(二进制)
-5(十进制)->10000101(二进制)
真值
用“+”、“-”号加绝对值来表示数值的大小,用这种形式表示的数值。比如下面的+5,-5。
5(十进制)-> 00000101(二进制)-> +000 0101=+5
-5(十进制)->10000101(二进制)-> -000 0101 =-5
总结一下,真值是带有正负号的数值,机器数是用0或1来表示正负号的数值。
原码、反码和补码的概念
先说结论:
- 正数的原码、反码、补码都相同;
- 负数的原码:最高位为1,其余位为真值的绝对值;
- 负数的反码:在原码的基础上,符号位不变,其余位按位取反;
- 负数的补码:在原码的基础上,符号位不变,其余位取反,最后加1;也就是在反码的基础上加1。
原码
原码:第一位表示符号,其余位表示值。举例说明
+12-> 0000 1100 (原码)
-12-> 1000 1100 (原码)
对应的取值范围就是[1111 1111,0111 1111]
,范围是[-127,127]
反码
正数的原码、反码、补码都相同;
负数的反码:在原码的基础上,符号位不变,其余位按位取反。举例说明:
+12-> 0000 1100 (原码) -> 0000 1100(反码)
-12-> 1000 1100 (原码) -> 1111 0011(反码)
补码
正数的原码、反码、补码都相同;
负数的补码:比如-12,
- -12的原码:1000 1100
- 最高位不变,其余位取反:1111 0011
- 加一得到补码:1111 0100
这里如果要将负数的补码转为原码,操作方法一样;
- -12的补码:1111 0100
- 最高位不变,其余位取反:1000 1011
- 加一得到原码:1000 1100
关于补码范围为什么是[-128~127]的问题?
这个问题我也没搞懂,可以先看看第二个参考链接,思考一下。
参考链接
https://www.cnblogs.com/red-code/p/6520462.html
https://wenku.baidu.com/view/4d9cfe8b7cd184254a353515.html