数字原始数据类型

时间:2012-11-04 03:26:48

标签: computer-science

在大多数编程语言中,积分数据类型具有有限范围,总有一个负数而不是正数。

例如,在C中,一个字节是-128~127,并且int在-2 ^ 31和2 ^ 31-1之间。 是否有一个字节不是-127~128的原因,因为在直观意义上积极性更频繁发生?

4 个答案:

答案 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.这可能是一个非常有用的技巧。减法无需特别注意,这意味着它不需要自己的电路。