二进制中的原码、反码和补码 以及正负数的移位

机器数与真值

机器数

一个数的二进制表现形式。其中二进制最高位表示正负,1表示负数,0表示正数。比如

5(十进制)-> 00000101(二进制)

-5(十进制)->10000101(二进制)

真值

用“+”、“-”号加绝对值来表示数值的大小,用这种形式表示的数值。比如下面的+5,-5。

5(十进制)-> 00000101(二进制)-> +000 0101=+5

-5(十进制)->10000101(二进制)-> -000 0101 =-5

总结一下,真值是带有正负号的数值,机器数是用0或1来表示正负号的数值。

原码、反码和补码的概念

先说结论:

  1. 正数的原码、反码、补码都相同;
  2. 负数的原码:最高位为1,其余位为真值的绝对值;
  3. 负数的反码:在原码的基础上,符号位不变,其余位按位取反;
  4. 负数的补码:在原码的基础上,符号位不变,其余位取反,最后加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,

  1. -12的原码:1000 1100
  2. 最高位不变,其余位取反:1111 0011
  3. 加一得到补码:1111 0100

这里如果要将负数的补码转为原码,操作方法一样;

  1. -12的补码:1111 0100
  2. 最高位不变,其余位取反:1000 1011
  3. 加一得到原码:1000 1100

关于补码范围为什么是[-128~127]的问题?

这个问题我也没搞懂,可以先看看第二个参考链接,思考一下。

正数和负数的移位

首先计算机上显示的负数二进制都是负数的补码。
例如:
image
或者这个:
image
负数的二进制以补码的形式体现,

  1. 具体为首先10的原码变成二进制为00001010;
  2. 最高位取1变成-10的原码1000 1010->反码->1111 0101 -> 加1得到补码-> 1111 0110

负数左移这样理解,左移几位,右边就补几个0,右移的话需要注意右移几位,右边补几个1;
正数左移几位右边补几位0,右移几位就在右边补几个0;

参考链接

https://www.cnblogs.com/red-code/p/6520462.html

https://wenku.baidu.com/view/4d9cfe8b7cd184254a353515.html

posted @ 2019-08-10 11:51  伊万夫斯基  阅读(1723)  评论(0编辑  收藏  举报