Java转换?
java编译器在这种情况下做什么Java转换?,java,Java,java编译器在这种情况下做什么 for(int i=3;i< Math.sqrt(n);i=i+2) for(int i=3;i
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