Основные синтаксические и семантические единицы языка Java. Примитивныe типы данных и основные операторы языка: Методические указания к лабораторной работе, страница 5

Однако сужающее преобразование (narrowing conversion) – совсем другое дело. Сужающее преобразование происходит, если значение преобразуется в значение типа, диапазон которого не шире изначального. Сужающие преобразования не всегда безопасны: например, преобразование целого значения 13 в byte имеет смысл, а преобразование 13000 в byte неразумно, поскольку byte может хранить только числа от -128 до 127. Если во время сужающего преобразования могут быть потеряны данные, Java-компилятор формирует сообщение об ошибке для любого такого преобразования, даже если преобразуемое значение укладывается в более узкий диапазон указанного типа:

int i = 13;

byte b = i; // Компилятор не разрешит это выражение

Единственное исключение из правила - присвоение целого литерала (значения типа int) переменной byte или short, если значение литерала соответствует диапазону переменной.

Если вам все же необходимо выполнить сужающее преобразование, и вы уверены, что не потеряете и не исказите данные, то можно заставить Java выполнить преобразование посредством языковой конструкции приведение (cast). Для этого перед преобразуемым значением введите в круглых скобках имя нужного типа. Например:

int i = 13;

byte b = (byte) i; // Принудительное преобразование int в byte

i = (int) 13.456; // Принудительное преобразование литерала типа double в int 13

Приведение примитивных типов чаще всего используют для преобразования значений с плавающей точкой в целые числа. При этом дробная часть значения с плавающей точкой просто отбрасывается (то есть значение с плавающей точкой округляется по направлению к нулю, а не к ближайшему целому числу). Методы Math.round(), Math. floor() и Math. ceil() выполняют другие типы округления.

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

short s = (short) 0xffff; // Данные биты представляют число -1

char c = '\uffff'; // Те же биты представляют символ юникода

int i1 = s; // Преобразование типа short в int дает -1

int i2 = c; // Преобразование char в int дает 65535

В следующей таблице показано, как данные одного типа могут (или не могут) быть преобразованы в данные другого типа. Буквой N обозначена невозможность преобразования, буквой E – необходимость явного (explicit) принудительного указания требуемого преобразования, буквой A – то, что преобразование осуществляется автоматически. Символ * при букве A означает, что преобразование может привести к потере данных.

из: в:

boolean

byte

short

char

int

long

float

double

boolean

-

N

N

N

N

N

N

N

byte

N

-

A

E

A

A

A

A

short

N

E

-

E

A

A

A

A

char

N

E

E

-

A

A

A

A

int

N

E

E

E

-

A

A*

A

long

N

E

E

E

E

-

A*

A*

float

N

E

E

E

E

E

-

A

double

N

E

E

E

E

E

E

-

Операции языка Java