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

Mar*_* He 6 sql binary int signed

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

例如,a的上限int是2,147,483,647,ABS(下限)= 2,147,483,648.

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

编辑:更改,因为问题与DB没有直接关系

Luk*_*zda 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:

  • 这并不能完全解释为什么范围不是-127 - 128. (4认同)

Gor*_*off 5

这个问题实际上与数据库无关。

正如 lad2025 指出的那样,有偶数个值。因此,通过包括 0,将会多出一个正值或负值。您要问的问题似乎是:“为什么负值比正值多一个?”

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

为了解决这个问题,计算机科学家设计了带符号整数的二进制补码表示。(维基百科更详细地解释了这一点。)基本上,这种表示保持了可以测试的符号位的概念。但它改变了表示。如果+1 表示为001,则-1 表示为111。也就是说,负值是正值减1 的按位补码。事实上,负数总是通过减去 1 并使用按位补码来生成的。

问题是值 100(后跟任意数量的零)。符号位已设置,因此为负。然而,当你减去 1 并反转时,它又变成了它自己 (011 --> 100)。有一个争论称这个“无穷大”或“不是一个数字”。相反,它被分配了尽可能小的负数。