banner
NEWS LETTER

关于学习二进制时碰到的一些小细节

Scroll down

#EEE104

在学习二进制时(没想到学二进制竟然是在EEE的课上,有点难绷),在二进制的原码、补码、反码和取反操作上碰到了一些问题。
经过和 @b1n@suchen 的讨论,疑团才算一一解开,在这里简单记录总结一下。

还有一点要注意的是,在英语中,原码是 true form,1’s complement 表示反码,2’s complement 表示补码。

首先,直接划重点

  • 取反是一定0变1,1变0;
  • 正数的反码不是正数取反得到的;
  • 负数的反码是正数取反得到的;
  • 取反+1是得到负数的补码,不是原码;
  • 要得到负数的原码直接将其绝对值的二进制原码前加一个符号位1就可以了。

接下来,一一解释这五点:

取反是一定0变1,1变0

- 二进制取反,又称二进制反码运算,是指对二进制数的每一位进行取反,即0变为1,1变为0。

之前疑惑的点是:既然取反一定是0变1,1变0,那么为什么整数的反码和原码是一样的呢?

原码补码反码

这就要说到第二点了:

正数的反码不是正数取反得到的

- 正数的原码,反码,补码均相同,正数的反码就是原码,补码与原码相同。

负数的反码是正数取反得到的

- 负数的反码等于负数的原码符号位不变,数值位取反的二进制数,正数取反是对正数的二进制数原码的每一位进行取反,得到的就是对应负数的反码。

取反+1是得到负数的补码,不是原码

- 我们一般说为了得到一个负数的二进制数,通常是对应正数的二进制数取反再+1 —— 这里正数的二进制数通常就是正数的原码(不过正数的原补反其实都一样),而得到的负数的二进制数通常是其补码,而涉及到负数的计算,一般都使用负数的补码。

要得到负数的原码直接将其绝对值的二进制原码前加一个符号位1就可以了

- 上面的图表已经显示的很明白了,负数的原码其实就是正数的原码直接最高位 0 变 1 即可。但是似乎并没有太大用,因为涉及到负数计算似乎还是用补码。

  • 综上,原码通常最好理解,能快速对应其十进制的数值 —— 但是如果涉及到计算,尤其是涉及到负数的,我们通常用补码来计算。补码除了理解会困难些,似乎没有什么不好了。

如有错误,请及时指出~评论发邮件均可,欧内盖!

Other Articles
Article table of contents TOP
  1. 1. 首先,直接划重点
  2. 2. 取反是一定0变1,1变0
  3. 3. 正数的反码不是正数取反得到的
  4. 4. 负数的反码是正数取反得到的
  5. 5. 取反+1是得到负数的补码,不是原码
  6. 6. 要得到负数的原码直接将其绝对值的二进制原码前加一个符号位1就可以了
Please enter keywords to search