为什么负整数比正整数多一个?

Why is there one more negative int than positive int?

任何 int 数据类型(不包括 tinyint)的上限总是比下限的绝对值小 1。

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

为什么负数总是比正数多一个?

编辑:已更改,因为问题与数据库的

没有直接关系

您提供的类型是有符号整数。让我们看一个字节(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:

  • 带符号的幅度表示
  • 个数的补码
  • Two's complement

这个问题与数据库无关。

正如 lad2025 指出的那样,有偶数个值。因此,通过包括 0,将多一个正值或负值。你问的问题好像是:"Why is there one more negative value than positive value?"

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

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

问题是值 100(后跟任意数量的零)。符号位已设置,因此为负。但是,当您减去 1 并反转时,它又变成了它自己 (011 --> 100)。将此称为 "infinity" 或 "not a number" 是有争议的。相反,它被分配了尽可能小的负数。

假设您有一个 4byte (32 bit) 整数。 C++定义的范围是-2<sup>31</sup>2<sup>31</sup>-1。 所以我们最终得到一个范围 -2<sup>31</sup>.....0......2<sup>31</sup>。 我们可以将其视为具有 2<sup>31</sup> 个非负整数 (包括注释 0)和 2<sup> 31</sup> 个负整数.