在大多数编程语言中,积分数据类型具有有限范围,总有一个负数而不是正数。
例如,在C中,一个字节是-128~127,并且int在-2 ^ 31和2 ^ 31-1之间。 是否有一个字节不是-127~128的原因,因为在直观意义上积极性更频繁发生?
答案 0 :(得分: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(最高有效位 - 前一位)以表示负数。该概念称为Twos' Complement,并被大多数计算机用作表示二进制(基数2)表示法中的整数的方法。
要获得更多信息,请查看二进制计算
答案 1 :(得分:0)
这是因为2的补码表示法。符号位为0表示正数,1表示负数。因此,使用4位作为一个更简单的例子:
正:0为0000,1为0001等,最高为0111为7。
否定:-1为1111,-2为1110等,低至1000为-8。
答案 2 :(得分: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
答案 3 :(得分:0)
在大多数编程语言中,积分数据类型的范围是有限的,总有一个负数而不是正数。
这是因为几乎总是使用2的补码。
两个补码如此受欢迎的原因基本上归结为硬件原因。特别是:
a - b = a + (~b + 1)
示例(4位字):
0110 - 0101 = 0110 + 1010 + 1 = 0110 + 1011 = 0001
(请注意,添加步骤基本上是无符号加法 - 在这些步骤中没有对符号位进行特殊处理)
基本上,在硬件领域,您可以将a - b
更改为a + ~b + 1
添加,并将初始进位设置为1.这可能是一个非常有用的技巧。减法无需特别注意,这意味着它不需要自己的电路。