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


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

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

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

4 53

4 ответа:

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

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

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

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

другая причина может заключаться в том, что JVM не знает о short и byte. Все вычисления и хранение выполняются с помощью ints, longs, floats и Double внутри JVM.

есть несколько вещей, чтобы рассмотреть.

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

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

3) всегда можно привести литерал, экс (короткий)10