任何int
数据类型(不包括tinyint
)的上限始终小于下限的绝对值。
例如,int
的上限为2,147,483,647,ABS(下限)= 2,147,483,648。
为什么总有一个负int而不是正int?
编辑:由于问题与数据库没有直接关系
,因此已更改答案 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 ++定义的范围是-231
至231-1
。
因此,我们最终得到了范围-231.....0......231
。
我们可以认为这具有231 non negative integers
(包括注释0)和231 negative integers
。