计算机基础整数的补码表示及负整数的左右移

37次阅读

共计 611 个字符,预计需要花费 2 分钟才能阅读完成。

作者:LogM
本文原载于 https://segmentfault.com/u/lo…,转载请注明出处~

1. 补码的表示形式

计算机中整数用补码表示。

举例:假设数值类型为 char 型(8 位)

 十进制:8
原码:0000 1000
补码:0000 1000(正数的补码等于原码)
 十进制:-8
原码:1000 1000
反码:1111 0111
补码:1111 1000(负数的补码等于反码加 1)

2. 为什么用补码表示

用补码表示是为了使计算机的整数加法能用同一种电路完成,无论是正整数还是负整数。

建议阅读:LeetCode 习题:位运算实现整数加法

3. 补码的本质

以 - 8 为例:

 十进制:-8
补码:1111 1000

可以发现,- 8 的补码与 248 的二进制表示竟然相同。

 十进制:248
二进制:1111 1000

这是巧合吗?

char 型共 8 位,所以有:

$$
2^8 + (-8) = 248
$$

可能我解释不够清楚,小伙伴们可以自己用谷歌检索答案。

4. 负数的左右移

  • 左移:不断在右边补 0,符号位会被移出,全移完是 0
  • 右移:不断在左边补 1,全移完是 - 1 的补码
  • 观察可知:负数的右移不再严格对应整数除法的除 2
 十进制:-8
补码:1111 1000
左移后的补码:1111 0000(十进制 -16)右移后的补码:1111 1100(十进制 -4)十进制:-5
补码:1111 1011
左移后的补码:1111 0110(十进制 -10)右移后的补码:1111 1101(十进制 -3,而整数除法的除 2 结果为 -2,两者不对应)

正文完
 0