Довольно маленький вопрос, но я заинтригован. Скажем, у меня есть следующий код:
byte b = 123134235;
Байт может хранить только количество -128 до 127. Имея это в виду, что произойдет, если я дам ему значение 123134235
во "внутреннем" масштабе. Когда я пытаюсь скомпилировать код, я получаю следующую ошибку:
test.java:10: error: possible loss of precision
Но что на самом деле делает компилятор Java? Это просто сохранение значения как 123... или?
Извиняюсь за мой бессвязный английский, я действительно устал (5 утра!)
Если вы передадите свое задание байту, он переполнится,
byte b = (byte) 123134235;
byte u = (byte) (Byte.MIN_VALUE - 1);
byte o = (byte) (Byte.MAX_VALUE + 1);
System.out.printf("b = %d, u = %d, o = %d%n", (int) b, (int) u, (int) o);
u
- пример нижнего потока (на 1 меньше минимального действительного байта), а o
- еще один пример переполнения (1 больше максимального допустимого байта). И выход,
b = 27, u = 127, o = -128
Что говорит нам, что byte
имеет диапазон -128 до 127 и что (123134235 % 256)
равен 27.
byte b = (byte) 123134235;
это дало мне 121, потому что это то, что (123134235% 256) :)
Что у вас здесь
byte b = 123134235;
является постоянным выражением, в котором будет предпринята попытка сужения примитивного преобразования. Спецификация языка Java
Сужение примитивного преобразования может быть использовано, если тип переменной является байтом, коротким или char, а значение константного выражения представляется в типе переменной.
Значение, целочисленный литерал 123134235
не представляется byte
типа, поэтому компиляция не выполняется.
Прежде всего byte b = 123134235;
обыкновение компиляции на compile time
, что происходит потому, что это тип int
, вы не можете хранить int
в byte
без приведения его.
But what is the Java compiler actually doing? Is it just storing the value as 123... or?
Он фактически хранит его, но вместо этого он будет переполняться с положительного на отрицательный, потому что байтом является только 8-битное подписанное целое число из двух дополнений.
Теперь давайте рассчитать его с помощью modulos
:
System.out.println(b % Byte.MIN_VALUE);
остаток будет действительным значением байта, который равен 27
byte b = 123134235;
даже не компилируется: поэтому компилятор ничего не делает, кроме как отказаться от его компиляции.
В Eclipse с Java 7 я получаю следующую ошибку компиляции для этого объявления и инициализации:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from int to byte