但是我正在为Java编写一个解析器,当涉及到对原始类型的操作时,我有点迷失了。
例如,我有以下表达式:
int i;
long l;
float f;
short s;
byte b;
//this is being cast from a float to an int? should this be a cast from byte?
int var1 = (int) (l * i * f * s * b);
//this is being cast from a float to an int? should this be a cast from long?
int var2 = (int) (l * (i * f * s * b));
//again casting from float to int? should this be a cast from short?
int var3 = (int) ((f) * (l) * (s));
//this seems to be a float but i expected this to be a long
int var4 = (int) ((f) * (l));
我相信最后要做的操作将是结果类型,但是,似乎与上面的示例不同。 (我没有列出任何带有双精度的操作,但是,似乎双精度优先于float。)
[我的另一种想法是,由于它必须执行浮点算术运算,因此会将其转换为最大(32/64)位类型,这样就不会丢失任何信息,除非有一个特定的强制转换隐藏了它的事实< [was一个浮点数/双精度数,例如,以下表达式的计算结果为long。
int var1 = (l * i * (int) d * s * b);
但是这种想法的确不足,如果同一表达式中有一个long / float,如果long的值太大而无法容纳float,则您很有可能会丢失信息。
left-associative。因此:
l * i * f * s * b
评估为
(((l * i) * f) * s) * b
更准确地说:
有这两点:
l * i
很长(l * i) * f
是浮点数((l * i) * f) * s
是浮点数(((l * i) * f) * s) * b
是浮点数。