任何int
数据类型(不包括tinyint
)的上限始终小于下限的绝对值。为什么有一个比正整数更多的负整数?
例如,int
的上限是2,147,483,647,ABS(下限)= 2,147,483,648。
是否有一个原因,为什么总是会有一个负int比正int?
编辑:既然问题改变的是没有直接关系的DB的
任何int
数据类型(不包括tinyint
)的上限始终小于下限的绝对值。为什么有一个比正整数更多的负整数?
例如,int
的上限是2,147,483,647,ABS(下限)= 2,147,483,648。
是否有一个原因,为什么总是会有一个负int比正int?
编辑:既然问题改变的是没有直接关系的DB的
您提供的是符号整数类型。我们来看一个字节(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. –
谢谢lad2025,在阅读完补语 –
这个问题是不是真的涉及到数据库。
正如lad2025指出的那样,存在偶数个值。所以,通过包含0,就会有一个正值或负值。你所问的问题似乎是:“为什么有一个比正值更多的负值?”
基本上,原因是符号位。负数的一种可能的实现方式是使用n-1位作为绝对值,然后使用0和1作为符号位。这种方法的问题是它允许+0和-0。这是不可取的。
为了解决这个问题,计算机科学家设计了带符号整数的二进制补码表示法。 (Wikipedia explains this in more detail。)基本上,这种表示保持了可以测试的符号位的概念。但它改变了表示。如果+1表示为001,那么-1表示为111.也就是说,负值是正值减一的按位补码。实际上,负总是通过减1和使用逐位补码产生的。
问题是值100(后面跟着任意数量的零)。符号位被设置,所以它是负的。但是,当你减1并反转时,它又变成了自己(011-> 100)。有一种说法叫做“无限”或“不是数字”。相反,它被分配最小的可能的负数。
后,我明白了原因。感谢Gordon的帮助,我在阅读Wiki后了解它。我认为你的意思是-1表示为111,二进制补码0全为0,这就是为什么有一个负值比正值多一个原因。再次感谢! –
@MarkHe。 。 。非常感谢你。我从记忆中写下了原文,自从那些计算机科学课程以来,这已经有一段时间了。我确定了答案。 –
因为0没有'+0和-0'。 2^32是偶数。你有一个0,所以你有2^31-1这是奇怪的。你不能走负面和相同的长度 – lad2025
https://en.m.wikipedia.org/wiki/Two%27s_complement –