Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么编程语言中的数值是有限的?_Java - Fatal编程技术网

Java 为什么编程语言中的数值是有限的?

Java 为什么编程语言中的数值是有限的?,java,Java,为什么数值是有限的?。如果我们有唯一标识符来标识web应用程序的用户,会发生什么。例如:Facebook、Google+。他们拥有数十亿用户。它们使用什么数据类型来存储唯一标识符。如果他们使用字符串数据类型,他们如何使用和范围受到限制的原因是每个数字类型占用一定数量的字节。这决定了类型的范围 例如,对于两个字节,只能表示-32768到32767之间的值(如果使用无符号类型,则表示0到65535之间的值) 他们拥有数十亿用户 在您的示例中,long显然足够宽,可以表示数十亿个值(甚至int也可以表

为什么数值是有限的?。如果我们有唯一标识符来标识web应用程序的用户,会发生什么。例如:Facebook、Google+。他们拥有数十亿用户。它们使用什么数据类型来存储唯一标识符。如果他们使用
字符串
数据类型,他们如何使用
范围受到限制的原因是每个数字类型占用一定数量的字节。这决定了类型的范围

例如,对于两个字节,只能表示-32768到32767之间的值(如果使用无符号类型,则表示0到65535之间的值)

他们拥有数十亿用户

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

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


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

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

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

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

另外,请查看Java不推荐Date类和推荐Calendar类的原因。Calendar类提供了更好的表示时间的方法,而不是以毫秒为单位来表示时间,因为这是一个非常大的数字;可能比Facebook用户的数量还要多


也就是说,Java提供了
Java.math.biginger
Java.math.BigDecimal
来处理真正的大数字。

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

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

这同样适用于所有其他范围,但位数更大。所以,使用有限数字的原因是为了节省内存


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

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


我还怀疑他们是否需要准确地比较用户的ID。

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

现在当我们说byte时,我们(通常)指的是8位。这意味着2^8个可能的数字。然而,我们通常为符号保留一位(正或负)。所以我们得到2^7个数字,平均分布在零附近。或者–128到127,正如你所说。(这有点简化,因为事情会变得更复杂)


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

您可以根据需要创建变量

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
为什么数值是有限的

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

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

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

public class MyVariable{
    public byte variable;
    MyVariable(int a){
        variable = new byte[a];
    }
}
如果我们有唯一标识符来标识web应用程序的用户,会发生什么

唯一标识符通常是有限的,并用基数36或更高进行编码

例如:Facebook、Google+。他们拥有数十亿用户

A
long
有十亿,因此这是preety小数字

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

64位的值就足够了

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

对于ID,它们不需要使用这样的运算符,只需要==和!=

是否有任何理由限制数字值


因为你的机器不是无限的,你想充分利用你拥有的硬件。

你看到
long
的最大值了吗?大约10亿美元。这不是你的问题吗?一个处理器有多大,处理器有多少位?为什么你要使用<代码> >代码>和代码>边注:例如,C++中的任何操作符,如代码> >代码>或代码>,实际上我不确定脸谱网使用什么……我想有一次我看到了一个facebook api的答案,上面的id是:)
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