Почему в Java нет байтов или коротких литералов? - PullRequest
53 голосов
/ 25 ноября 2008

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

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

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

Ответы [ 4 ]

15 голосов
/ 25 ноября 2008

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

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

8 голосов
/ 25 ноября 2008

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

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

4 голосов
/ 25 ноября 2008

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

2 голосов
/ 27 февраля 2013

Есть несколько вещей, которые следует учитывать.

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

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

3) Букву всегда можно разыграть, например, (короткий) 10

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...