作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
在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后,符号位有进位,被舍弃) |
注:正、负零的补码是一样的。