Глава преобразование 11 типа

11.1 Конверсия опкодов
виртуальной машина Java , включает в себя ряд основных типов преобразования работы коды операции, никаких операндов не резервные коды операций операции переключений выполняются, преобразованное значение получают из верхней части Zhan. Java - виртуальная машина значение извлекается из верхней части стека, преобразует его, а затем результат преобразования в стек. Для Int, преобразования между длинным, поплавком и двойными типами коды операции , как показаны в Таблице 11-1, для каждого типа возможных переходов между четырьмя типами, существует соответствующий код операции.

Как показано в таблице 11-2 код операции преобразуется в тип данных INT занимает меньше места, чем типа Int. Эти опкоды извлекаются из операнда найти значение целого типа, оно может быть преобразовано в значение INT байт, короткий или символ описано, то это значение типа INT человека преобразуется стека давление. i2b поп команда усечен байтами типа значения целого типа, то его знаковое расширение для восстановления Int. I2S поп инструкция значение целого типа обрезается короткий тип, то его знаковое расширение для восстановления Int. i2c целого типа поп-инструкции Char усечена значение типа, а затем восстановлена ​​в нулевом расширенный междунар.

Виртуальная машина Java не долго, поплавок, значения двойных типа непосредственно в тип данных занимает меньше места, чем тип опкод междунар. Таким образом, значение типа с плавающей точкой в ​​байты требует два шагов: во-первых, это значение должно быть преобразовано в типе поплавка значения типа INT f2i команды, а затем, полученные значения затем преобразуются в значении типа Int i2b инструкции байт.

Несмотря на код операции может быть преобразован в целочисленное значение, чем значение типа Int занимает тип данных меньше пространства (байты, короткие, и символы), но не существует никакой операции код операции преобразования выполняется в направлении, противоположном. Поскольку любой байт, короткий, и полукокса в значениях типа пресс-фитинг для него, эффективно преобразовано в значение типа Int. Принятие инструкции байт, короткий, и символьного типа или значения из массива объектов в куче, и эти значения будут вдавливается в команду найти, чтобы преобразовать их в целочисленное значение типа. Эти инструкции будут описаны в главе 15.

Связывает байты, короткий, и типа символ сначала арифметические значения операций преобразуются к типу INT, INT значения типа , а затем вычисляет, чтобы получить конечный результат типа Int. Таким образом, если добавить два типа байтовых значений, конечный результат будет типом Int. Если результат должен быть байты должны быть результатом явного типа Int к типу байт. Например, следующий код заставляет компилятор к сбою:
// на компакт-диске в On Файл с опкоды / EX1 / BadArithmetic.java
класса BadArithmetic {

addOneAndOne байт статического () {
Байт = А. 1;
байт = Б. 1;
байт С = А + В;
возвращение С;
}
}
Операция может составить Javac и генерирует GoodArithmetic.class файл. Этот файл содержит следующие addOneAndOne () последовательность байт - кода Метод:
0 iconst_1 // Константа 1. Нажмите INT
1 // istore_0 поп в локальной переменной 0, А , который:.
. // А = 1 байт;
2 // iconst_1 . Снова Нажмите INT 1 Константа.
3 istore_1 // поп в локальной переменной 1, в , который:..
// байт = 1 В.;
. 4 iload_0 // Нажмите А (А является таким, как уже хранимых в межд
// локальная
// переменная 0) .
. 5 iload_1 Нажмите // B (B является таким, как уже хранимым в междах
// локальная
// переменной. 1).
. 6 addition.Top из Выполняют iadd // стек
// теперь (А + в), AN Int.
. // Результат i2b Преобразовать Int 7 до байта (результат все равно
// Занимает 32 бита).
8 istore_2 // поп в локальной переменной 3, которая..
// байт С: С = байт (байт) (А + В);
9 . Iload_2 значение Push - C // поэтому он может быть
// возвращен.
10 ireturn // Добавление: возвращение с;
что метод преобразования () будет демонстрировать значение типа INT преобразует значение типа Java виртуальной машины байт способом. imInt начальное значение переменной 125, после каждого цикла, то он будет увеличиваться на единицу, а к типу байтов. Затем он становится продуктом исходного значения и значение -1, и , наконец , снова преобразуется в тип байт. Этот процесс моделирования может быстро показать , что происходит на границе рабочего диапазона байта.

Максимальное значение типа байта 127, минимальное значение -128. Int значение типа в пределах этого диапазона непосредственно преобразуются в значение байта, когда значения целого типа за пределами этого диапазона допустимых значений, становятся все интереснее.

Виртуальная машина Java продлены усеченной форме и подписанному преобразуется в значение байта целочисленное значение. Наиболее значимый бит ( «бит знак») долго, INT, короткий и указали, что этот тип значения INT типа байт является положительным или отрицательным. Если бит знака равен 0, то значение п, если бит знака равен 1, то отрицательное. Тип бит 7 байта знаковый бит. Int значения типа переход от значения байта, значение 7 будет скопировано в 8 по 31 бит. Это дает значение INT типа, исходное значение этой величины преобразуется в значение результирующего байта INT типа, полученном имеют одинаковое значение. После выполнения операции усечения и по знаку, внутр переменного типа, которые будут получать действительное значение типа байт.

апплет списки моделируются, что произошло при преобразовании байт за эффективный диапазон с типом значения байта INT типа. После того, как, например, imlnt переменного 128 (0x00000080), он преобразуется в байты, значение типа байт, полученного -128 (Oxffffff8O). Затем, когда переменная imlnt -129 (Oxffffff7f). Он был преобразован в значение типа байт, полученный 127 (0x0000007f).

 

рекомендация

отwww.cnblogs.com/mongotea/p/11980066.html
рекомендация