Я пишу парсер для 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) битовый тип, так что никакая информация не теряется, если только нет определенного приведения, скрывающего тот факт, что было с плавающей запятой / double, например, следующее выражение оценивается как long.
int var1 = (l * i * (int) d * s * b);
Это мышление не соответствует действительности, однако, если в одном и том же выражении есть long / float, есть вероятность, что вы потеряете информацию, если значение long слишком велико, чтобы вписаться вплавать.