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 и выходит за рамки offbyteвведите результат приведен кbyte. Это выражение производит-128.
JLS3 #5.2 преобразование задание
( переменная = выражение )
кроме того, если выражение является постоянным выражением (§15.28) типа byte, short, char или int :
сужающее примитивное преобразование может использоваться, если тип переменной байт, короткий или char, а значение константного выражения представимо в типе переменной.
без этого пункта, мы не сможем пиши
byte x = 0; char c = 0;но мы должны быть в состоянии сделать это? Я так не думаю. Среди первобытных людей существует довольно много магии, и нужно быть очень осторожным. Я бы изо всех сил старался писать
byte x = (byte)0;
Comments