Философия Java

         

Литералы


Обычно, когда вы вставляете литерное значение в программу, компилятор точно знает каким типом его сделать. Однако иногда тип неоднозначен. Когда это случается, вы должны указать компилятору дополнительную информацию в форме символов, ассоциированных со значением литерала. Приведенный ниже код показывает эти символы:

//: c03:Literals.java

class Literals { char c = 0xffff; // максимальное шестнадцатиричное значение для char

byte b = 0x7f; // максимальное шестнадцатиричное значение для byte

short s = 0x7fff; // максимальное шестнадцатиричное значение для short

int i1 = 0x2f; // Шестнадцатирично-десятичное (в нижнем регистре)

int i2 = 0X2F; // Шестнацчатирично-десятичное (в верхнем регистре)

int i3 = 0177; // Восьмеричное (ведущий ноль)

// Шестнадцатиричные и восьмиричные также работают с long.

long n1 = 200L; // суффикс для long

long n2 = 200l; // суффикс для long

long n3 = 200; //! long l6(200); // не допустимо

float f1 = 1; float f2 = 1F; // суффикс для float

float f3 = 1f; // суффикс для float

float f4 = 1e-45f; // 10 - основание степени

float f5 = 1e+9f; // суффикс для float

double d1 = 1d; // суффикс для double

double d2 = 1D; // суффикс для double

double d3 = 47e47d; // 10 - основание степени

} ///:~

Шестнадцатерично-десятичные (основание 16), которые работают со всеми интегрированными типами данных, указываются лидирующим символом 0x или 0X, за которыми следует 0—9 и далее a—f в верхнем, либо в нижнем регистре. Если вы попробуете проинициализировать переменную с помощью значения, большего, чем она может принять (не зависимо от числовой формы значения), компилятор выдаст вам сообщение об ошибке. Обратите внимание в приведенном выше коде на максимально допустимое шестнадцатирично-десятичное значение для char, byte и short. Если вы превысите его, компилятор автоматически преобразует значение к int и скажет вам, что необходимо сужающее приведение для присваения. Вы найдете это место, остановившись на этой строке.

Восьмеричные (основание 8) указываются лидирующим нулемв цисле и цифррами 0-7. Нет специальных литералов для бинарного впедсталения в C, C++ или Java.


Замыкающие символы после литерного значения устанавливают тип. Символ L в верхнем или нижнем регистре означает long, верхний или нижний регистр F означает float, а верхний или нижний регистр D означает double.

Используется експонентная запись, которую я всегда находил пугающей: 1.39 e-47f. В науки и инженерии ‘e’ означает основание натурального логарифма, примерно 2.718. (Более точное значение типа double доступно в Java, как Math.E.) Здесь используется экспонентное выражение, такое как 1.39 x e-47, которое означает 1.39 x 2.718-47. Однако когда был создан FORTRAN, то решили, что e на самом деле будет означать “десять в степени”, что было странным решением, потому что FORTRAN был предназначен для науки и инжененрии, и можно подумать, что его разработчики будут чувствительны к введению такой неоднозначности. [25] В любом случае это перешло в C, C++ и теперь в Java. Так что, если вы используете мышление в терминах e, как основания натурального логарифма, вы должны в уме выполнить перевод, когда используете такое выражение, как 1.39 e-47f в Java; это означает 1.39 x 10-47.

Обратите внимание, что вам нет необходимости использовать завершающий символ, когда компилятор может определить подходящий тип. В примере

long n3 = 200;

нет неоднозначности, так что L после 200 будет излишним. Однако в примере

float f4 = 1e-47f; // 10 в степени

компилятор обычно принимает експоненциальные числа как числа двойной точности, так что без завершающего f это даст вам ошибку, говорящую вам о том, что вы должны использовать приведение для преобразования double к float.


Содержание раздела