Что произойдет, если я превышу предел переменной в Java?

1

Довольно маленький вопрос, но я заинтригован. Скажем, у меня есть следующий код:

byte b = 123134235;

Байт может хранить только количество -128 до 127. Имея это в виду, что произойдет, если я дам ему значение 123134235 во "внутреннем" масштабе. Когда я пытаюсь скомпилировать код, я получаю следующую ошибку:

test.java:10: error: possible loss of precision

Но что на самом деле делает компилятор Java? Это просто сохранение значения как 123... или?

Извиняюсь за мой бессвязный английский, я действительно устал (5 утра!)

  • 5
    Он не будет хранить ничего, если он не скомпилируется.
  • 0
    Оооо! Я только заметил, я думаю, я думал, что это было предупреждение от того, как это было сформулировано, тогда я заметил большие буквы, говорящие «ошибка», смеется.
Показать ещё 4 комментария
Теги:
numbers
byte

4 ответа

0
Лучший ответ

Если вы передадите свое задание байту, он переполнится,

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.

  • 0
    Ооо, так что, когда я сделал byte b = (byte) 123134235; это дало мне 121, потому что это то, что (123134235% 256) :)
  • 0
    @ user3839220 Я получаю 27. Проверьте это снова, потому что 121 не правильно.
Показать ещё 8 комментариев
1

Что у вас здесь

byte b = 123134235;

является постоянным выражением, в котором будет предпринята попытка сужения примитивного преобразования. Спецификация языка Java

Сужение примитивного преобразования может быть использовано, если тип переменной является байтом, коротким или char, а значение константного выражения представляется в типе переменной.

Значение, целочисленный литерал 123134235 не представляется byte типа, поэтому компиляция не выполняется.

0

Прежде всего 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

0

byte b = 123134235; даже не компилируется: поэтому компилятор ничего не делает, кроме как отказаться от его компиляции.

В Eclipse с Java 7 я получаю следующую ошибку компиляции для этого объявления и инициализации:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Type mismatch: cannot convert from int to byte

Ещё вопросы

Сообщество Overcoder
Наверх
Меню