计算机基础 - 负数的二进制表示
在计算机运算中,有符号数的表示(英语:signed number representations)需要将负数编码为二进制形式。
在数学中,任意基数的负数都在最前面加上“−”符号来表示。然而在计算机硬件中,数字都以无符号的二进制形式表示,因此需要一种编码负号的方法。当前有四种方法,用于扩展二进制数字系统,来表示有符号数:原码(sign-and-magnitude)、反码(ones’ complement)、补码(two’s complement)以及移码(offset binary,excess-N)。
表示法1. 正数 5 的表示法假设有一个 int 类型的数,值为 5,那么,我们知道它在计算机中表示为: 00000000 00000000 00000000 00000101 5 转换成二制是 101,不过 int 类型的数占用 4 字节(32位),所以前面填了一堆 0。
2. 负数 -5 的表示法现在想知道,-5 在计算机中如何表示?在计算机中,负数以原码的补码形式表达。
概念原码、反码、补码,是表示带符号二进制数的最常用的方法。
1. 原码所谓原码,就是一个符号位加原数绝对值。
表面上,原码已经可以表示出一些数字了,但是在实际的计算机中会引发一些问题。 例如,0 和 -0 的八位二进制原码分别是 00000000 和 10000000 ,但事实上它们俩是同一个数。所以,这就需要引进反码和补码的概念。
2. 反码 (ones’ complement)所谓反码,就是 除了符号位 ,其他每一位都是原码对应位 异或 1 的值。 与原码同样,反码不能将 0 和 -0 看作同一个数。
n >= 0, 反码与原码形式一样n < 0, 符号位不变,其余各位按位取反对两个反码表示形式的数字做加法,首先需要进行常规的二进制加法,但还需要在和的基础上加上进位。为什么必须这样呢?来看下面这个−1加上+2的例子。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
二进制 十进制
11111110 -1
+ 00000010 +2
............ ...
1 00000000 0 <-- 错误答案
1 +1 <-- 加上进位
............ ...
00000001 1 <-- 正确答案
----------------------------------------
二进制 十进制
11111110 -1
+ 00001000 +8
............ ...
1 00000110 6 <-- 错误答案
1 +1 <-- 加上进位
............ ...
00000111 7 <-- 正确答案
3. 补码 (two’s complement)那么,既然原码和反码都不能很好的将0和-0化为同一个数,这时候,补码就派上用场了。
n >= 0 时,补码与原码相同。n < 0 时,则是 反码 +1 。补码(two’s complement)回避了 0 有多种表示的问题以及循环进位的需要。
下表列出了 4-bit 二进数所能表示的整数:
二进制数无符号有符号反码(一补码(ones’ complement))补码(二补码(two’s complement))000000000001111100102222001133330100444401015555011066660111777710008-0-7-810019-1-6-7101010-2-5-6101111-3-4-5110012-4-3-4110113-5-2-3111014-6-1-2111115-7-0-1练习:
数字源码反码补码-01000_00001111_11110000_000000000_00000111_11110000_000010000_00010111_11100000_0000-11000_00011111_11101111_11111270111_11110000_00000000_0001-1271111_11111000_00001000_0001-128