Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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_Integer Arithmetic - Fatal编程技术网

Java原语范围计算

Java原语范围计算,java,integer-arithmetic,Java,Integer Arithmetic,在Java中,当我们声明 short number=1024*1024*1024; 它将给出编译时错误,但是 short number=1024 * 1024 * 1024 * 1024; 汇编得很好。为什么会发生这种情况 在这种情况下,编译器将对计算进行求值(因为它只包含常量),并尝试将结果分配给变量。此计算使用类型int完成,如果可能,仅在赋值时转换为short 在您的情况下,第一次计算太大,无法放入short(1073741824)。第二个将溢出int,并在short支持的范围内结束

在Java中,当我们声明

short number=1024*1024*1024; 
它将给出编译时错误,但是

short number=1024 * 1024 * 1024 * 1024;

汇编得很好。为什么会发生这种情况

在这种情况下,编译器将对计算进行求值(因为它只包含常量),并尝试将结果分配给变量。此计算使用类型
int
完成,如果可能,仅在赋值时转换为
short

在您的情况下,第一次计算太大,无法放入
short
1073741824
)。第二个将溢出
int
,并在
short
支持的范围内结束(
0
)。因此,在这种情况下,作业是有效的


请注意,您可能永远都不想在代码中依赖这些东西。

您面临的问题就如同您的数字一样。在第一种情况下,它没有环绕,因此超出了短距离的范围。但在第二种情况下,它在计算A后会卷绕,因此它在短范围内,因此没有编译时错误

精度损失意味着您正在丢失给定值的信息。(短数据类型是一个16位有符号2的补码整数。它的最小值为-32768,最大值为32767(包括)。)在第一种情况下,短数据的范围被跨越(1073741824),因此您正在丢失信息

有符号整数到整数类型T的缩小转换 只需丢弃除n个最低阶位以外的所有位,其中n是数字 用于表示类型T的位的数目

编辑:-

来自(在类似问题中提到得非常正确)

如果int类型的十进制文本较大,则为编译时错误 大于2147483648(231),或者如果出现十进制文字2147483648 除一元减号运算符的操作数以外的任何位置 ()


通过将其中一个更改为
1024L
,我们也可以看到这一点,在这种情况下,计算是作为
长的
进行的,并且不会发生溢出,从而再次导致编译错误。@user2169777:-精度损失意味着您正在丢失给定值的信息。(short数据类型是一个16位有符号2的补码整数。它的最小值为-32768,最大值为32767(包括)。在第一种情况下,short的范围被跨越(1073741824)因此,您丢失了信息。因此您收到了错误。@Raedwald,Erwin,Ivan,Carlos我的问题与您提到的问题不同。这里的问题不仅是关于数字的文字和运行时计算,而且它与短的范围有关,在上面的问题中,即使没有一个表达式是文字,第一个是gives错误,问题是为什么在编译过程中会发生这样的行为?不管怎样,谢谢,现在我对以下答案感到满意。我这边的好问题+1