为什么还有一个负int而不是正int?

时间:2015-11-13 16:50:43

标签: sql binary int signed

任何int数据类型(不包括tinyint)的上限始终小于下限的绝对值。

例如,int的上限为2,147,483,647,ABS(下限)= 2,147,483,648。

为什么总有一个负int而不是正int?

编辑:由于问题与数据库没有直接关系

,因此已更改

3 个答案:

答案 0 :(得分:5)

您提供的类型是有符号整数。让我们看一个字节(8位)的例子。使用1个字节,您有2^8个组合,可以存储256个可能的数字。

现在你想拥有相同数量的正数和负数(每组应该有128个)。

关键点是0没有+0-0。只有一个0

所以你最终得到了范围-128..-1..0..1..127

同样的逻辑适用于16/32/64-bit

修改

为什么范围是-128 to 127

这取决于您 represent signed integer

的方式

答案 1 :(得分:2)

这个问题与数据库无关。

正如lad2025指出的那样,有一些偶数值。因此,通过包含0,将会有一个更多的正值或负值。你问的问题似乎是:“为什么还有一个负值而不是正值?”

基本上,原因是符号位。负数的一种可能实现是使用n-1位作为绝对值,然后使用0和1作为符号位。这种方法的问题是它允许+0和-0。这是不可取的。

为了解决这个问题,计算机科学家设计了有符号整数的二进制补码表示法。 (Wikipedia explains this in more detail。)基本上,这种表示维护了可以测试的符号位的概念。但它改变了表现形式。如果+1表示为001,则-1表示为111.即,负值是正值的逐位补码减1。实际上,负数总是通过减1和使用逐位补码来生成。

问题是值100(后跟任意数量的零)。符号位已设置,因此为负。但是,当你减1并反转时,它再次变为自身(011 - > 100)。有一种说法是称这种“无穷大”或“不是数字”。相反,它被分配了尽可能小的负数。

答案 2 :(得分:0)

假设您有一个4byte (32 bit)整数。 C ++定义的范围是-231231-1。 因此,我们最终得到了范围-231.....0......231。 我们可以认为这具有231 non negative integers(包括注释0)和231 negative integers