Спецификация L числа Java (длинная)


похоже, что при вводе числа в Java компилятор автоматически считывает его как целое число, поэтому при вводе (long) 6000000000 (не в диапазоне integer) он будет жаловаться, что 6000000000 не является целым числом. Чтобы исправить это, мне пришлось указать 6000000000L. я только что узнал об этой спецификации.

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

6 78

6 ответов:

есть определенные суффиксы для long (например,39832L),float (например,2.4f) и double (например,-7.832d).

если суффикса нет, а он является целым типом (например 5623), предполагается, что это int. Если это не интегральный тип (например 3.14159), предполагается, что это double.

во всех остальных случаях (byte,short,char), вам нужен бросок, так как нет конкретного суффикса.

спецификация Java позволяет использовать оба верхних и строчные суффиксы, но верхний регистр версии для longs предпочтительнее, так как верхний регистр L менее легко спутать с цифрой 1 чем нижний регистр l.

посмотреть JLS раздел 3.10 для кровавых деталей (см. Определение IntegerTypeSuffix).

Я надеюсь, что вы не будете возражать против небольшой касательной, но подумал, что вам может быть интересно узнать, что кроме F (для поплавка), D (для двойного), и L (долго), было сделано предложение добавить суффиксы к byte и short -Y и S соответственно. Это устранит необходимость приведения к байтам при использовании литерального синтаксиса для байтовых (или коротких) массивов. Цитируя пример из предложения:

главное преимущество: почему платформа лучше, если предложение будет принято?

отвратительная код типа

 byte[] stuff = { 0x00, 0x7F, (byte)0x80,  (byte)0xFF};

может быть записано как

 byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };

Джо Дарси курирует проект Coin для Java 7, и блог был простой способ отслеживать эти предложения.

Это литералы и описаны в 3.10 спецификации языка Java.

по умолчанию любой интегральный примитивный тип данных (byte, short, int, long) будет рассматриваться как int тип компилятором java. Ибо байт и короче, пока значение, присвоенное им, находится в их диапазоне, нет проблем и не требуется суффикс. Если значение присвоено байт и короче превышает их диапазон, требуется явное приведение типа.

пример:

byte b = 130; // CE: range is exceeding.

чтобы преодолеть этот тип выполнения литье.

byte b = (byte)130; //valid, but chances of losing data is there.

в случае длинного типа данных, он может принять целочисленное значение без каких-либо хлопот. Предположим, мы назначаем как

Long l = 2147483647; //which is max value of int

в этом случае суффикс типа L/l не требуется. По умолчанию значение 2147483647 считается компилятором java типа int. Внутреннее приведение типов выполняется компилятором, а int автоматически повышается до длинного типа.

Long l = 2147483648; //CE: value is treated as int but out of range 

здесь нам нужно поставить суффикс как L для обработки литерала 2147483648 как длинный тип java компилятор.

Итак, наконец-то

Long l = 2147483648L;// works fine.

кажется, это было бы хорошо потому что (я предполагаю) если бы вы могли укажите номер, который вы вводите короткий, то java не придется бросьте его

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

считаем:

long l = -1 >>> 1;

и

int a = -1;
long l = a >>> 1;

теперь вы ожидаете, что фрагменты кода беспокойства дадут то же значение переменной l. Поэтому нам нужно выражение int литералы должны быть выполнены как int s.