2015-11-13 127 views
4

任何int数据类型(不包括tinyint)的上限始终小于下限的绝对值。为什么有一个比正整数更多的负整数?

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

是否有一个原因,为什么总是会有一个负int比正int?

编辑:既然问题改变的是没有直接关系的DB的

+9

因为0没有'+0和-0'。 2^32是偶数。你有一个0,所以你有2^31-1这是奇怪的。你不能走负面和相同的长度 – lad2025

+2

https://en.m.wikipedia.org/wiki/Two%27s_complement –

回答

4

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

+3

这并不完全解释为什么范围不是-127 - 128. –

+1

谢谢lad2025,在阅读完补语 –

2

这个问题是不是真的涉及到数据库。

正如lad2025指出的那样,存在偶数个值。所以,通过包含0,就会有一个正值或负值。你所问的问题似乎是:“为什么有一个比正值更多的负值?”

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

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

问题是值100(后面跟着任意数量的零)。符号位被设置,所以它是负的。但是,当你减1并反转时,它又变成了自己(011-> 100)。有一种说法叫做“无限”或“不是数字”。相反,它被分配最小的可能的负数。

+0

后,我明白了原因。感谢Gordon的帮助,我在阅读Wiki后了解它。我认为你的意思是-1表示为111,二进制补码0全为0,这就是为什么有一个负值比正值多一个原因。再次感谢! –

+0

@MarkHe。 。 。非常感谢你。我从记忆中写下了原文,自从那些计算机科学课程以来,这已经有一段时间了。我确定了答案。 –

相关问题