📌  相关文章
📜  表示有符号整数的不同方式

📅  最后修改于: 2022-05-13 01:56:08.391000             🧑  作者: Mango

表示有符号整数的不同方式

有符号整数是带有正“+”或负号“-”的整数。由于计算机只理解二进制,因此有必要以二进制形式表示这些有符号整数。

在二进制中,有符号整数可以用三种方式表示:

  1. 签名位。
  2. 1 的补码。
  3. 2 的补码。

让我们看看为什么 2 的补码被认为是最好的方法。

有符号位表示

在有符号整数表示方法中,遵循以下规则:

1. MSB(最高有效位)代表整数的符号。
2. 幅度由 MSB 以外的其他位表示,即 (n-1) 位,其中 n 是编号。位。
3. 如果数字为正,则 MSB 为 0,否则为 1。
4. n 位数的有符号整数表示的范围为 –(2^{n-1}-1) 到 (2)^{n-1}-1。

例子:

有符号位表示:

Positive Numbers

SignMagnitudeDecimal Representation
0000+0
0001+1
0010+2
0011+3
0100+4
0101+5
0110+6
0111+7

Negative Numbers

SignMagnitudeDecimal Representation
1000-0
1001-1
1010-2
1011-3
1100-4
1101-5
1110-6
1111-7

缺点:

1. 对于 0,有两种表示形式:-0 和 +0,因为 0 既不是 –ve 也不是 +ve。
2. 在表示的 2^n 位中,我们只能使用 2^{n-1} 位。
3. 数字不是循环顺序的,即在最大数字之后(例如,+7)下一个数字不是最小数字(例如,+0)。
4.对于负数签名扩展不起作用。

例子:
+5 签名扩展

+5 签名扩展

-5 的签名扩展

-5 的签名扩展

5. 正如我们在上面看到的,对于 +ve 表示,如果 4 位扩展到 5 位,则只需在 MSB 中附加 0。
6. 但是如果在-ve 表示中做同样的事情,我们将不会得到相同的数字。即10101≠11101。

1 的有符号整数的补码表示

在 1 的补码表示中,使用以下规则:

1. 对于 +ve 数,表示规则与有符号整数表示相同。
2. 对于 -ve 数字,我们可以采用以下两种方法中的任何一种:

  • 将 +ve 数写成二进制并取 1 的补码。
  • 为 –X 写出 2^n-1-X 的无符号表示。

3. n 位数的 1 的补码整数表示的范围为 –(2^{n-1}-1) 到 2^{n-1}-1。

1 的补码表示:

Positive Numbers
SignMagnitudeNumber
00   0   0+0
00   0   1+1
00   1   0+2
00   1   1+3
01   0   0+4
01   0   1+5
01   1   0+6
01   1   1+7
Negative Numbers
SignMagnitudeNumber
10   0   0-7
10   0   1-6
10   1   0-5
10   1   1-4
11   0   0-3
11   0   1-2
11   1   0-1
11   1   1-0

缺点

  1. 对于 0,有两种表示形式:-0 和 +0,这不应该是这种情况,因为 0 既不是 –ve 也不是 +ve。
  2. 在表示的 2^n 位中,我们只能使用 2^{n-1} 位。

有符号位表示的优点:

1. 数字按循环顺序排列,即在最大数字之后(例如,+7),下一个数字是最小数字(例如,-7)。
2.对于负数签名的扩展作品。

示例: +5 的签名扩展

-5 的签名扩展

-5 的签名扩展

3. 如上所示,对于 +ve 和 -ve 表示,如果将 4 位扩展到 5 位,则只需在 MSB 中分别附加 0/1。

2 的补码表示

在 2 的补码表示中,使用了以下规则:

1.对于+ve数,表示规则与有符号整数表示相同。
2. 对于 -ve 数字,我们可以用两种不同的方式来表示数字。

  • 以 n 位表示形式为 –X 写出 2^nX 的无符号表示。
  • 写出 +X 的表示形式并取 2 的补码。

3. n 位的表示范围为 –(2^{n-1} ) 到 (2)^{(n-1)-1}。

2 的补码表示(4 位)

2 的补码表示(4 位)

优点:

  1. 0 的表示没有歧义。
  2. 数字是循环顺序的,即+7 之后是-8。
  3. 签名扩展有效。
  4. 可以使用 2 的补码表示的数字范围非常大。

由于有符号整数的 2 的补码表示的所有上述优点,二进制数使用 2 的补码方法而不是有符号位和 1 的补码表示。