C笔记-原码、反码、补码

作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!

在Java、PHP中,基本不需要考虑原码、反码、补码、有符号数、无符号数这些问题,但现在学习C,发现这些东西时时刻刻需要用到。再来温习一下这些最基础的知识。

环境 | Enviroment

  • 操作系统:RedHat 5.7 64bit
  • GCC: 4.1.2

基础知识 | Basis

注:以下是以32位整数为例进行说明。

计算机的最小度量单位,也称比特(bit)。
字节 由8个二进制位组成。
原码 一个数本身的二进制形式。
反码 正数的反码与原码相同,负数的反码是将除符号位外的其余位求反
补码 正数的补码与原码相同,负数的补码是将除符号位外的其余位求反,再加1

例:

十进制数 8 其原码是 0000 0000 0000 0000 0000 0000 0000 1000
其反码是 0000 0000 0000 0000 0000 0000 0000 1000
其补码是 0000 0000 0000 0000 0000 0000 0000 1000
十进制数 -8 其原码是 1000 0000 0000 0000 0000 0000 0000 1000
其反码是 1111 1111 1111 1111 1111 1111 1111 0111
其补码是 1111 1111 1111 1111 1111 1111 1111 1000

实战 | Practice

1、那么8 + (-8),其运算过程是怎样的呢?
首先,要弄清楚一点:在计算机中,数值一律用补码来表示。 原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
+8 的补码 0000 0000 0000 0000 0000 0000 0000 1000
-8 的补码 1111 1111 1111 1111 1111 1111 1111 1000

相加结果 0000 0000 0000 0000 0000 0000 0000 0000 (符号位有进位,被舍弃)

2、+0 (正零)、-0(负零)用原码和补码如何表示?

+0 原码:0000 0000 0000 0000 0000 0000 0000 0000
+0 反码:0000 0000 0000 0000 0000 0000 0000 0000
+0 补码:0000 0000 0000 0000 0000 0000 0000 0000
-0 原码:1000 0000 0000 0000 0000 0000 0000 0000
-0 反码:1111 1111 1111 1111 1111 1111 1111 1111
-0 补码:0000 0000 0000 0000 0000 0000 0000 0000 (反码加1后,符号位有进位,被舍弃)

注:正、负零的补码是一样的。