您提供的类型是有符号整数.让我们看一个字节(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:
这个问题实际上与数据库无关。
正如 lad2025 指出的那样,有偶数个值。因此,通过包括 0,将会多出一个正值或负值。您要问的问题似乎是:“为什么负值比正值多一个?”
基本上,原因是符号位。负数的一种可能实现是使用 n - 1 位作为绝对值,然后使用 0 和 1 作为符号位。这种方法的问题在于它允许 +0 和 -0。这是不可取的。
为了解决这个问题,计算机科学家设计了带符号整数的二进制补码表示。(维基百科更详细地解释了这一点。)基本上,这种表示保持了可以测试的符号位的概念。但它改变了表示。如果+1 表示为001,则-1 表示为111。也就是说,负值是正值减1 的按位补码。事实上,负数总是通过减去 1 并使用按位补码来生成的。
问题是值 100(后跟任意数量的零)。符号位已设置,因此为负。然而,当你减去 1 并反转时,它又变成了它自己 (011 --> 100)。有一个争论称这个“无穷大”或“不是一个数字”。相反,它被分配了尽可能小的负数。