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

StackOverflow https://stackoverflow.com/questions/317816

  •  11-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top