Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.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,java编译器在这种情况下做什么 for(int i=3;i< Math.sqrt(n);i=i+2) for(int i=3;i

java编译器在这种情况下做什么

for(int i=3;i< Math.sqrt(n);i=i+2) 
for(int i=3;i
Math.sqrt
返回一个
double
,Javac是否将
i
扩展为
double

如果我想使用
int
值,我需要重新转换它吗


这实际上是如何工作的?

Java中没有加宽,这是由以下问题所暗示的:“编译器将i加宽为双精度”。如果将变量定义为int,它将始终是int。在内部,某些类型的表示可能超出必要范围(例如,short可能存储为4字节而不是2字节),但这不受变量使用方式的影响/确定

具体地说,在循环中,编译器会发出代码,将从
Math.sqrt()
返回的double转换为整数

您可以将其视为编译器将代码重写如下:

for(int i=3; (double) i < (Math.sqrt(n)); i=i+2)
for(int i=3;(double)i<(Math.sqrt(n));i=i+2)

(感谢发表评论的人。修复了代码片段)

Java中没有加宽,这一点可以从“编译器将i加宽为双精度”的问题中看出。如果将变量定义为int,它将始终是int。在内部,某些类型的表示可能超出必要范围(例如,short可能存储为4字节而不是2字节),但这不受变量使用方式的影响/确定

具体地说,在循环中,编译器会发出代码,将从
Math.sqrt()
返回的double转换为整数

您可以将其视为编译器将代码重写如下:

for(int i=3; (double) i < (Math.sqrt(n)); i=i+2)
for(int i=3;(double)i<(Math.sqrt(n));i=i+2)
(感谢发表评论的人。修复了片段)

sqrt返回一个double,那么Javac是否将i扩展为double

如果我想使用int值,我需要重新转换它吗

这实际上是如何工作的

对于基本体,如果操作中的类型比其他类型宽,则会自动转换较小的类型

sqrt返回一个double,那么Javac是否将i扩展为double

如果我想使用int值,我需要重新转换它吗

这实际上是如何工作的


对于基本体,如果操作中的类型比其他类型宽,则会自动转换较小的类型

是的,
i
被扩大为临时的
双值
,用于比较。
i
本身的值不受影响。

是的,
i
被扩大到一个临时的
double
,用于比较。
i
本身的值不受影响。

语言规则说,i将被提升为double,然后与sqrt的返回值进行比较

编译器可以自由地做任何它喜欢的事情,只要它产生相同的行为


如果任何编译器除了将I提升为double并进行比较之外,还做了其他事情,我会感到惊讶。在大多数体系结构上,促销既简单又便宜。很难找到一个更快的正确替代方案。

语言规则说,我将被提升为double,然后与sqrt的返回值进行比较

编译器可以自由地做任何它喜欢的事情,只要它产生相同的行为


如果任何编译器除了将I提升为double并进行比较之外,还做了其他事情,我会感到惊讶。在大多数体系结构上,促销既简单又便宜。很难想出一个正确的、速度更快的替代方案。

不是;我被提升了,而不是相反。没有“编译器将i扩展为双精度”这一问题所暗示的扩展。如果将变量定义为int,它将始终为int。在内部,某些类型的表示可能超出必要范围(例如,short可能存储为4字节而不是2字节),但这不受变量使用方式的影响/确定。josh,Ernest-我站起来更正了我不小心写了错误的转换。现在已修复。您的代码段仍然不正确。就像编译器将代码重写为
((double)i)
我想我知道Itay在他的评论中想说什么。变量i的类型没有改变,但是比较点处的值i被转换为一个double,并且基本上被存储为临时变量(double类型),用于比较;我被提升了,而不是相反。没有“编译器将i扩展为双精度”这一问题所暗示的扩展。如果将变量定义为int,它将始终为int。在内部,某些类型的表示可能超出必要范围(例如,short可能存储为4字节而不是2字节),但这不受变量使用方式的影响/确定。josh,Ernest-我站起来更正了我不小心写了错误的转换。现在已修复。您的代码段仍然不正确。就像编译器将代码重写为
((double)i)
我想我知道Itay在他的评论中想说什么。变量i的类型没有改变,但是比较点处的值i被转换为一个double,并且基本上作为临时变量(double类型)存储,用于比较。解释第二点的含义。要将
int
用作
int
,您永远不必将其转换为
int
,即使它在比较过程中被隐式转换。参考5.6.2二进制数字升级请解释第二点的含义。要将
int
用作
int
,您永远不必将其转换为
int
,即使它在比较过程中被隐式转换。参考5.6.2 Bi