-1
long  –9,223,372,036,854,775,808 to  9 ,223,372,036,854,775,807
int   –2,147,483,648 to 2,147,483,647
short – 32,768 to 32,767
byte  – 128 to 127

为什么数值是有限的?如果我们有唯一标识符来识别我的 Web 应用程序的用户,会发生什么。例如:脸书、谷歌+。他们拥有数十亿用户。他们使用什么数据类型来存储唯一标识符。如果他们使用string数据类型,他们如何使用><操作符。有什么理由限制数值吗?

谢谢,卡南

4

9 回答 9

4

范围受到限制的原因是每种数字类型都占用一定数量的字节。这决定了类型的范围。

例如,对于两个字节,它只能表示从 -32,768 到 32,767 的值(或者如果使用无符号类型,则从 0 到 65,535)。

他们拥有数十亿用户。

在您的示例中,long显然足够宽以代表数十亿个值(甚至可以代表数十亿个值int)。

如果他们使用字符串数据类型,他们如何使用 > 和 < 运算符。

首先,您可以使用字典顺序比较字符串。其次,甚至不清楚为什么需要以这种方式比较用户 ID。

于 2013-01-07T08:16:16.943 回答
2

这一切都源于内存管理。计算机程序需要知道变量在其生命周期内将使用多少内存,因此是有限的值。

于 2013-01-07T08:16:27.437 回答
1

这都是关于计算机二进制数中的数字表示。看看这里这里

于 2013-01-07T08:19:34.473 回答
1

这与数字在计算机中的表示方式有关,我们使用二进制位来表示(在硬件级别)数字。因此,如果您使用一个二进制位,则可以表示两个数字。0 和 1(当然,根据您的解释,它们可以是任意两个数字)。现在,如果您使用 2 个二进制位,您可以表示 4 个数字 00、01、10 和 11。下一位为您提供 8 个数字,依此类推。看到模式了吗?它始终是可用位数的 2 次方。

现在当我们说字节时,我们(通常)是指 8 位。这意味着 2^8 个可能的数字。但是我们通常为符号保留一位(正或负)。所以我们得到 2^7 个数字,它们平均分布在零附近。或 – 128 到 127,如您所说。(这有点简化,因为二进制补码会使事情更加复杂)。

tl;dr:我们“限制”数字范围的原因是硬件限制。

于 2013-01-07T08:24:16.583 回答
0

它必须受到限制。想想一个数字可以有多大,需要多少字节来表示它们?CPU 和 RAM 也有各种限制,例如一次处理的位数。

此外,请查看 Java 弃用 Date 类并推荐 Calendar 类的原因。Calendar 类提供了更好的表示时间的方法,而不是从纪元以来的毫秒数,这是一个非常大的数字;也许比 Facebook 用户的数量大得多。

也就是说,Java 提供java.math.BigIntegerjava.math.BigDecimal用于处理非常大的数字。

于 2013-01-07T08:20:17.773 回答
0

整数类型由于它们在内存中的存储方式而受到限制。它归结为二进制(所有计算的基础上的 1 和 0)。

一个字节是 8 位(二进制数字),8 位可以存储的最多数据是 2^8,即 256,当分成两半以允许负数时,这给出了您引用的 -128 到 127 范围,或者 0 到 255,如果您使用无符号类型。(注意这不是 256,因为 0 也是需要表示的值)

所有其他范围也是如此,但位数更大。因此,使用有限数字的原因是为了节省内存。

需要更高数字的系统可以使用更多内存来存储数据,除了系统内存之外没有固有限制。

于 2013-01-07T08:21:32.863 回答
0

我敢打赌 Google+、Facebook 等不会使用数字作为用户标识符。还有其他类型可以用于此。例如 GUID,表示全局唯一标识符。它看起来像一个字符串,有时包含数字字母和破折号,并且数据库保证它是唯一的。

而且我怀疑他们是否需要准确比较用户的身份。

于 2013-01-07T08:21:35.167 回答
0

为什么数值是有限的?

类型不是无限的原因是因为您机器的资源不是无限的。

相反,减少内存和 CPU 消耗以使用易于在硬件中实现的数据类型是很自然的。这意味着数据类型是字节的倍数(标准化为 8 位)和 2 字节的幂。这决定了每种数据类型可以具有的唯一值的数量。Java 进一步限制了这一点,在 AFAIK 的基础上只有一个无符号类型,签名类型更自然地处理。

这就是为什么这些类型是有限的

byte - signed 8 bits => -2^7 to 2^7-1
char - unsigned 16-bits => 0 to 2^16-1
short - signed 16-bits => -2^15 to 2^15-1
int - signed 32-bits => -2^31 to 2^31-1
long - signed 64-bit => -2^63 to 2^63-1

如果我们有唯一标识符来识别我的 Web 应用程序的用户,会发生什么。

唯一标识符通常受到限制,并以 36 或更高为基数进行编码。

例如:脸书、谷歌+。他们拥有数十亿用户。

Along有十亿,十亿,所以相比之下,这是一个很小的数字。;)

他们使用什么数据类型来存储唯一标识符。

64 位值就足够了。

如果他们使用字符串数据类型,他们如何使用 > 和 < 运算符。

对于 id,他们不需要使用这样的运算符,只有 == 和 !=。

有什么理由限制数值吗?

因为您的机器不是无限的,并且您希望充分利用您拥有的硬件。

于 2013-01-07T09:02:18.040 回答
-1

您可以根据需要创建变量。

public class MyVariable{
    public byte variable;
    MyVariable(int a){
        variable = new byte[a];
    }
}
于 2013-01-07T08:25:26.440 回答