2

在整数数据类型具有有限范围的大多数编程语言中,负数总是比正数多一个。

例如,在 C 中,一个字节为 -128~127,而一个 int 介于 -2^31 和 2^31-1 之间。一个字节不是-127~128的原因是什么,因为直觉上正数出现的频率更高?

4

4 回答 4

3

最大的正数是 0111 1111 = 127

128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
 0  | 1  |  1 |  1 | 1 | 1 | 1 | 1 |

最大的负字节为 1000 0000 = -128

-128| 64 | 32 | 16 | 8 | 4 | 2 | 1 |
 1  | 0  |  0 |  0 | 0 | 0 | 0 | 0 |

在二进制中,MSB(最高有效位 - 前一位)被保留以表示负数。这个概念被称为二进制补码,大多数计算机都将其用作以二进制(以 2 为底)表示法表示整数的一种方式。

要获得更多信息,请查看二进制计算

于 2012-11-04T03:33:05.680 回答
0

这是因为 2 的补码表示法。符号位为 0 表示正,1 表示负。因此,使用 4 位作为更简单的示例:

正数:0 为 0000,1 为 0001,以此类推,直到 0111 为 7。

负数:-1 是 1111,-2 是 1110,依此类推,直到 1000 为 -8。

于 2012-11-04T03:41:20.013 回答
0

(我知道这不能回答你的问题,但它确实解决了你问题中的一个不真实的假设,并且留下评论太长了。)

实际上,C 标准并没有定义字节的大小。

唯一可以保证的是char能够容纳一个角色。

过去,字节的范围在 5 到 9 位之间,具体取决于 CPU。

确实,大部分的野性已经安定下来,并且大多数现有系统确实使用 8 位字节。

// What the C standard says must be true:
sizeof char <= sizeof int <= sizeof long

这就是为什么许多 pre-c99(和 c99)系统包含以下非常有用的 typedef:

int8
uint8
int16
uint16
int32
uint32
于 2012-11-04T03:45:33.523 回答
0

在整数数据类型具有有限范围的大多数编程语言中,负数总是比正数多一个。

这是因为几乎总是使用 2 的补码。

二进制补码如此受欢迎的原因基本上归结为硬件原因。尤其:

a - b = a + (~b + 1)

示例(4 位字):

0110 - 0101 = 0110 + 1010 + 1 = 0110 + 1011 = 0001(请注意,加法步骤本质上是无符号加法——在这些步骤中没有对符号位进行特殊处理)

基本上,在硬件领域,您可以将初始进位设置为 1 来更改a - b为加法a + ~b + 1。这可能是一个非常有用的技巧。减法不需要特别注意,这意味着它不需要自己的电路。

于 2012-11-04T03:47:46.763 回答