在整数数据类型具有有限范围的大多数编程语言中,负数总是比正数多一个。
例如,在 C 中,一个字节为 -128~127,而一个 int 介于 -2^31 和 2^31-1 之间。一个字节不是-127~128的原因是什么,因为直觉上正数出现的频率更高?
在整数数据类型具有有限范围的大多数编程语言中,负数总是比正数多一个。
例如,在 C 中,一个字节为 -128~127,而一个 int 介于 -2^31 和 2^31-1 之间。一个字节不是-127~128的原因是什么,因为直觉上正数出现的频率更高?
最大的正数是 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 为底)表示法表示整数的一种方式。
要获得更多信息,请查看二进制计算
这是因为 2 的补码表示法。符号位为 0 表示正,1 表示负。因此,使用 4 位作为更简单的示例:
正数:0 为 0000,1 为 0001,以此类推,直到 0111 为 7。
负数:-1 是 1111,-2 是 1110,依此类推,直到 1000 为 -8。
(我知道这不能回答你的问题,但它确实解决了你问题中的一个不真实的假设,并且留下评论太长了。)
实际上,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
在整数数据类型具有有限范围的大多数编程语言中,负数总是比正数多一个。
这是因为几乎总是使用 2 的补码。
二进制补码如此受欢迎的原因基本上归结为硬件原因。尤其:
a - b = a + (~b + 1)
示例(4 位字):
0110 - 0101 = 0110 + 1010 + 1 = 0110 + 1011 = 0001
(请注意,加法步骤本质上是无符号加法——在这些步骤中没有对符号位进行特殊处理)
基本上,在硬件领域,您可以将初始进位设置为 1 来更改a - b
为加法a + ~b + 1
。这可能是一个非常有用的技巧。减法不需要特别注意,这意味着它不需要自己的电路。