Подтвердить что ты не робот

Почему в Java нет байтов или коротких литералов?

Я могу создать буквальное число, добавив L к значению; почему я не могу создать буквальный короткий или байт каким-то другим способом? Почему мне нужно использовать int-литерал с литом?

И если ответ "Потому что в C не было короткого литерала", то почему в C? нет коротких литералов?

Это не влияет на мою жизнь каким-либо значимым образом; достаточно легко написать (короткий) 0 вместо 0S или что-то еще. Но непоследовательность вызывает у меня любопытство; это одна из тех вещей, которые беспокоят вас, когда вы поздно ночью. Кто-то в какой-то момент принял дизайнерское решение, позволяющее вводить литералы для некоторых примитивных типов, но не для всех из них. Почему?

4b9b3361

Ответ 1

В C, int, по крайней мере, должен был быть "естественный" размер слова процессора, а long, вероятно, должен был быть "большим натуральным" размером слова (не уверен в этой последней части, но он также объясняет, почему int и long имеют одинаковый размер на x86).

Теперь, я предполагаю, что для int и long существует естественное представление, которое точно соответствует машинным регистрам. Однако для большинства процессоров меньшие типы byte и short должны были быть дополнены до int в любом случае перед использованием. Если это так, вы можете также сделать бросок.

Ответ 2

Я подозреваю, что это случай "ничего не добавляйте к языку, если он действительно не добавляет значения", - и это считалось добавлением достаточно небольшого значения, чтобы его не стоило. Как вы сказали, легко обойти, и, откровенно говоря, это редко необходимо в любом случае (только для устранения неоднозначности).

То же самое верно в С#, и я никогда особо не пропускал его ни на одном из языков. То, что я пропустил в Java, это байтовый тип без знака:)

Ответ 3

Другая причина может заключаться в том, что JVM не знает о коротком и байте. Все вычисления и хранение выполняются с помощью ints, longs, floats и double в JVM.

Ответ 4

Можно рассмотреть несколько вещей.

1) Как обсуждалось выше, JVM не имеет понятия байтов или коротких типов. Обычно эти типы не используются при вычислении на уровне JVM; поэтому можно подумать, что использование этих литералов будет меньше.

2) Для инициализации байтов и коротких переменных, если int-выражение является постоянным и в разрешенном диапазоне этого типа оно неявно приводится к типу-мишени.

3) Можно всегда использовать литерал, ex (короткий) 10