二进制中的原码、反码和补码 以及正负数的移位
机器数与真值
机器数
一个数的二进制表现形式。其中二进制最高位表示正负,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]的问题?
这个问题我也没搞懂,可以先看看第二个参考链接,思考一下。
正数和负数的移位
首先计算机上显示的负数二进制都是负数的补码。
例如:
或者这个:
负数的二进制以补码的形式体现,
- 具体为首先10的原码变成二进制为00001010;
- 最高位取1变成-10的原码1000 1010->反码->1111 0101 -> 加1得到补码-> 1111 0110
负数左移这样理解,左移几位,右边就补几个0,右移的话需要注意右移几位,右边补几个1;
正数左移几位右边补几位0,右移几位就在右边补几个0;
参考链接
本文作者:benjieqiang
本文链接:https://www.cnblogs.com/benjieqiang/p/11331047.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步