朝鲜世界杯_2019篮球世界杯 - dyldrk.com

计算机基础 - 负数的二进制表示

在计算机运算中,有符号数的表示(英语: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