Почему "int i = 2147483647 + 1;" хорошо, но "байт b = 127 + 1;" не компилируется?



почему int i = 2147483647 + 1; ОК, но byte b = 127 + 1; не компилируется?

575   4  

4 ответов:

константы оцениваются как ints, поэтому 2147483647 + 1 переполняется и дает вам новый int, который присваивается int, в то время как 127 + 1 также оценивается как int равна 128, и это не присваивается byte.

литерал 127 обозначает значение типа int. Так же как и литерал 1. Сумма этих двух является целым числом 128. Проблема, во втором случае, заключается в том, что вы присваиваете это переменной типа byte. Это не имеет ничего общего с фактическим значением выражения. Это связано с тем, что Java не поддерживает принуждения (*). Вы должны добавить typecast

byte b = (byte)(127 + 1);

и затем он компилируется.

(*) по крайней мере, не из рода String-to-integer, float-to-Time,... Ява поддерживает ли принуждение, если они, в некотором смысле, не теряют (Java называет это "расширением").

и нет, слово "принуждение" не нужно исправлять. При этом он был выбран очень обдуманно и правильно. Из ближайшего источника (Wikipedia) : "В большинстве языков слово принуждение используется для обозначения подразумевается преобразование, либо во время компиляции, либо во время выполнения."и "в информатике преобразование типов, приведение типов и принуждение являются разные способы неявного или явного изменения сущности одного типа данных в другой.".

в качестве доказательства @MByD:

компилируется следующий код:

byte c = (byte)(127 + 1);

, потому что, хотя выражение (127 + 1) является int и выходит за рамки off byte введите результат приведен к byte. Это выражение производит -128.

JLS3 #5.2 преобразование задание

( переменная = выражение )

кроме того, если выражение является постоянным выражением (§15.28) типа byte, short, char или int :

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


без этого пункта, мы не сможем пиши

byte x = 0;
char c = 0;

но мы должны быть в состоянии сделать это? Я так не думаю. Среди первобытных людей существует довольно много магии, и нужно быть очень осторожным. Я бы изо всех сил старался писать

byte x = (byte)0;

Comments

    Ничего не найдено.