Spec-Zone .ru
спецификации, руководства, описания, API
|
Содержание | Предыдущий | Следующий | Индекс | Спецификация Виртуальной машины JavaTM |
Работа
Преобразоватьlong
кdouble
Формат
l2d
Формы
l2d = 138 (0x8a)
Стек операнда
..., значение..., результат
Описание
Значение на вершине стека операнда должно иметь типlong
. Это выталкивается от стека операнда и преобразовывается в adouble
результат используя IEEE 754 вокруг для самого близкого режима. Результат продвигается на стек операнда.
Примечания
l2d инструкция выполняет расширяющееся примитивное преобразование (§2.6.2), который может потерять точность потому что значения типа double
имейте только 53 бита мантиссы.
Работа
Преобразоватьlong
кfloat
Формат
l2f
Формы
l2f = 137 (0x89)
Стек операнда
..., значение..., результат
Описание
Значение на вершине стека операнда должно иметь типlong
. Это выталкивается от стека операнда и преобразовывается в afloat
результат используя IEEE 754 вокруг для самого близкого режима. Результат продвигается на стек операнда.
Примечания
l2f инструкция выполняет расширяющееся примитивное преобразование (§2.6.2), который может потерять точность потому что значения типа float
имейте только 24 бита мантиссы.
Работа
Преобразоватьlong
кint
Формат
l2i
Формы
l2i = 136 (0x88)
Стек операнда
..., значение..., результат
Описание
Значение на вершине стека операнда должно иметь типlong
. Это выталкивается от стека операнда и преобразовывается вint
результат, беря младший разряд 32 битаlong
значение и отбрасывание старшего разряда 32 бита. Результат продвигается на стек операнда.
Примечания
l2i инструкция выполняет сужающееся примитивное преобразование (§2.6.3). Это может потерять информацию о полной величине имеющей значение. У результата, возможно, также нет того же самого знака как значение.
Работа
Добавитьlong
Формат
ladd
Формы
ladd = 97 (0x61)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типlong
. Значения выталкиваются от стека операнда.long
результатом является value1 + value2. Результат продвигается на стек операнда.
Результатом являются 64 бита младшего разряда истинного математического результата в достаточно широком two's-дополнительном формате, представленном как значение типа long
. Если переполнение происходит, знак результата, возможно, не то же самое как знак математической суммы двух значений.
Несмотря на то, что переполнение может произойти, выполнение ladd инструкции никогда не бросает исключение на этапе выполнения.
Работа
Загрузкаlong
от массива
Формат
laload
Формы
laload = 47 (0x2f)
Стек операнда
..., arrayref, индекс..., значение
Описание
arrayref должен иметь типreference
и должен обратиться к массиву, компоненты которого имеют типlong
. Индекс должен иметь типint
. И arrayref и индекс выталкиваются от стека операнда.long
значение в компоненте массива по индексу получается и продвигается на стек операнда.
Исключения на этапе выполнения
Если arrayrefnull
, laload бросает aNullPointerException
.
Иначе, если индекс не в пределах границ массива, на который ссылается arrayref, laload инструкция бросает ArrayIndexOutOfBoundsException
.
Работа
Булевская переменная Иlong
Формат
земля
Формы
приземлитесь = 127 (0x7f)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типlong
. Они выталкиваются от стека операнда. Along
результат вычисляется, беря поразрядное И value1 и value2. Результат продвигается на стек операнда.
Работа
Хранилище вlong
массив
Формат
lastore
Формы
lastore = 80 (0x50)
Стек операнда
..., arrayref, индекс, оценивают...
Описание
arrayref должен иметь типreference
и должен обратиться к массиву, компоненты которого имеют типlong
. Индекс должен иметь типint
, и значение должно иметь типlong
. arrayref, индекс, и значение выталкиваются от стека операнда.long
значение сохранено как компонент массива, индексированного индексом.
Исключения на этапе выполнения
Если arrayrefnull
, lastore бросает aNullPointerException
.
Иначе, если индекс не в пределах границ массива, на который ссылается arrayref, lastore инструкция бросает ArrayIndexOutOfBoundsException
.
Работа
Сравнитьсяlong
Формат
lcmp
Формы
lcmp = 148 (0x94)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типlong
. Они и выталкиваются от стека операнда, и сравнение целого числа со знаком выполняется. Если value1 больше чем value2,int
значение 1 продвигается на стек операнда. Если value1 равен value2,int
значение 0 продвигается на стек операнда. Если value1 является меньше чем value2,int
значение-1 продвигается на стек операнда.
Работа
Продвинутьlong
постоянный
Формат
lconst _ <l>
Формы
lconst_0 = 9 (0x9) lconst_1 = 10 (0xa)
Стек операнда
......, <l>
Описание
Продвиньте long
постоянный <l> (0 или 1) на стек операнда.
Работа
Продвиньте элемент от пула константы этапа выполнения
Формат
ldc индекс
Формы
ldc = 18 (0x12)
Стек операнда
......, значение
Описание
Индекс является байтом без знака, который должен быть допустимым индексом в пул константы этапа выполнения текущего класса (§3.6). Запись пула константы этапа выполнения по индексу любой должен быть константой этапа выполнения типаint
илиfloat
, или должна быть символьная ссылка на строковый литерал (§5.1).
Если запись пула константы этапа выполнения является константой этапа выполнения типаint
илиfloat
, числовое значение той константы этапа выполнения продвигается на стек операнда какint
илиfloat
, соответственно.
Иначе, запись пула константы этапа выполнения должна быть ссылкой на экземпляр классаString
представление строкового литерала (§5.1). Areference
к тому экземпляру, значению, продвигается на стек операнда.
Примечания
ldc инструкция может только использоваться, чтобы продвинуть значение типаfloat
взятый от набора значений плавающего (§3.3.2), потому что константа типаfloat
в постоянном пуле (§4.4.4) должен быть взят от набора значений плавающего.
Работа
Продвиньте элемент от пула константы этапа выполнения (широкий индекс)
Формат
ldc_w indexbyte1 indexbyte2
Формы
ldc_w = 19 (0x13)
Стек операнда
......, значение
Описание
indexbyte1 без знака и indexbyte2 собираются в 16-разрядный индекс без знака в пул константы этапа выполнения текущего класса (§3.6), где значение индекса вычисляется как (indexbyte1 << 8) | indexbyte2. Индекс должен быть допустимым индексом в пул константы этапа выполнения текущего класса. Запись пула константы этапа выполнения по индексу любой должен быть константой этапа выполнения типаint
илиfloat
, или должна быть символьная ссылка на строковый литерал (§5.1).
Если запись пула константы этапа выполнения является константой этапа выполнения типаint
илиfloat
, числовое значение той константы этапа выполнения продвигается на стек операнда какint
илиfloat
, соответственно.
Иначе, запись пула константы этапа выполнения должна быть ссылкой на экземпляр классаString
представление строкового литерала (§5.1). Areference
к тому экземпляру, значению, продвигается на стек операнда.
Примечания
ldc_w инструкция идентична ldc инструкции за исключением ее более широкого индекса пула константы этапа выполнения.
ldc_w инструкция может только использоваться, чтобы продвинуть значение типаfloat
взятый от набора значений плавающего (§3.3.2), потому что константа типаfloat
в постоянном пуле (§4.4.4) должен быть взят от набора значений плавающего.
Работа
Продвинутьlong
илиdouble
от пула константы этапа выполнения (широкий индекс)
Формат
ldc2_w indexbyte1 indexbyte2
Формы
ldc2_w = 20 (0x14)
Стек операнда
......, значение
Описание
indexbyte1 без знака и indexbyte2 собираются в 16-разрядный индекс без знака в пул константы этапа выполнения текущего класса (§3.6), где значение индекса вычисляется как (indexbyte1 << 8) | indexbyte2. Индекс должен быть допустимым индексом в пул константы этапа выполнения текущего класса. Запись пула константы этапа выполнения по индексу должна быть константой этапа выполнения типаlong
илиdouble
(§5.1). Числовое значение той константы этапа выполнения продвигается на стек операнда как along
илиdouble
, соответственно.
Примечания
Только версия широкого индекса ldc2_w инструкции существует; есть инструкция № ldc2, которая продвигает along
илиdouble
с однобайтовым индексом.
ldc2_w инструкция может только использоваться, чтобы продвинуть значение типаdouble
взятый от двойного набора значений (§3.3.2), потому что константа типаdouble
в постоянном пуле (§4.4.5) должен быть взят от двойного набора значений.
Работа
Разделитьсяlong
Формат
ldiv
Формы
ldiv = 109 (0x6d)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типlong
. Значения выталкиваются от стека операнда.long
результатом является значение выражения value1 / value2 языка программирования Java. Результат продвигается на стек операнда.
Along
подразделение округляется к 0; то есть, частное, произведенное дляlong
значения в n / d являются along
оцените q, величина которого как можно больше, удовлетворяя. Кроме того q положителен, когда и n и d имеют тот же самый знак, но q отрицателен, когда и n и d имеют противоположные знаки.
Есть один особый случай, который не удовлетворяет это правило: если дивиденд является отрицательным целым числом самой большой величины дляlong
введите и делитель -1
, тогда переполнение происходит, и результат равен дивиденду; несмотря на переполнение, никакое исключение не выдается в этом случае.
Исключение на этапе выполнения
Если значение делителя в along
подразделение 0, ldiv бросаетArithmeticException
.
Работа
Загрузкаlong
от локальной переменной
Формат
lload индекс
Формы
lload = 22 (0x16)
Стек операнда
......, значение
Описание
Индекс является байтом без знака. И индекс и индекс + 1 должны быть индексами в массив локальной переменной текущего фрейма (§3.6). Локальная переменная по индексу должна содержать a long
. Значение локальной переменной по индексу продвигается на стек операнда.
Примечания
lload код операции может использоваться в соединении с широкой инструкцией, чтобы получить доступ к локальной переменной, используя двухбайтовый индекс без знака.
Работа
Загрузкаlong
от локальной переменной
Формат
lload _ <n>
Формы
lload_0 = 30 (0x1e) lload_1 = 31 (0x1f) lload_2 = 32 (0x20) lload_3 = 33 (0x21)
Стек операнда
......, значение
Описание
И <n> и <n> + 1 должны быть индексами в массив локальной переменной текущего фрейма (§3.6). Локальная переменная в <n> должна содержать a long
. Значение локальной переменной в <n> продвигается на стек операнда.
Примечания
Каждый из lload _ <n> инструкции является тем же самым как lload с индексом <n>, за исключением того, что операнд <n> неявен.
Работа
Умножитьсяlong
Формат
lmul
Формы
lmul = 105 (0x69)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типlong
. Значения выталкиваются от стека операнда.long
результатом является value1 * value2. Результат продвигается на стек операнда.
Результатом являются 64 бита младшего разряда истинного математического результата в достаточно широком two's-дополнительном формате, представленном как значение типа long
. Если переполнение происходит, знак результата, возможно, не то же самое как знак математической суммы двух значений.
Несмотря на то, что переполнение может произойти, выполнение lmul инструкции никогда не бросает исключение на этапе выполнения.
Работа
Инвертироватьlong
Формат
lneg
Формы
lneg = 117 (0x75)
Стек операнда
..., значение..., результат
Описание
Значение должно иметь типlong
. Это выталкивается от стека операнда.long
результатом является арифметическое отрицание имеющее значение, - значение. Результат продвигается на стек операнда.
Дляlong
значения, отрицание является тем же самым как вычитанием от нуля. Поскольку использование виртуальной машины Java two's-дополнительное представление для целых чисел и диапазона two's-дополнительных значений не симметрично, отрицание максимального отрицанияlong
результаты в том же самом максимальном отрицательном числе. Несмотря на то, что переполнение произошло, никакое исключение не выдается.
Для всехlong
значенияx
, -x
равняется (~x
) +1
.
Работа
Таблица переходов доступа ключевым соответствием и переходом
Формат
lookupswitch <0-3-байтовая клавиатура \> defaultbyte1 defaultbyte2 defaultbyte3 defaultbyte4 npairs1 npairs2 npairs3 npairs4 смещенные соответствием пары...
Формы
lookupswitch = 171 (0xab)
Стек операнда
..., ключ...
Описание
lookupswitch является инструкцией переменной длины. Сразу после lookupswitch кода операции, между нулем и тремя нулевыми байтами (обнуленные байты, не нулевой объект) вставляются как дополнение. Число нулевых байтов выбирается так, чтобы defaultbyte1 начался в адресе, который является кратным числом четырех байтов от запуска текущего метода (код операции его первой инструкции). Сразу после дополнения следуют за серией 32-разрядных значений со знаком: значение по умолчанию, npairs, и затем npairs пары 32-разрядных значений со знаком. npairs должен быть больше чем или равным 0. Каждая из npairs пар состоит из int
соответствуйте и 32-разрядное смещение со знаком. Каждое из этих 32-разрядных значений со знаком создается из четырех байтов без знака как (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4.
Таблица смещенные соответствием пары lookupswitch инструкции должна быть сортирована в увеличении числового порядка соответствием.
Ключ должен иметь тип int
и выталкивается от стека операнда. Ключ сравнивается со значениями соответствия. Если это равно одному из них, то целевой адрес вычисляется, добавляя соответствующее смещение к адресу кода операции этой lookupswitch инструкции. Если ключ не соответствует ни одного из значений соответствия, целевой адрес вычисляется, добавляя значение по умолчанию к адресу кода операции этой lookupswitch инструкции. Выполнение тогда продолжается в целевом адресе.
Целевой адрес, который может быть вычислен от смещения каждой смещенной соответствием пары, так же как того, вычисленного от значения по умолчанию, должен быть адресом кода операции инструкции в пределах метода, который содержит эту lookupswitch инструкцию.
Примечания
Выравнивание, требуемое 4-байтовых операндов lookupswitch инструкции, гарантирует 4-байтовое выравнивание тех операндов, если и только если метод, который содержит lookupswitch, располагается на 4-байтовую границу.
Смещенные соответствием пары сортируются, чтобы поддерживать подпрограммы поиска, которые более быстры чем линейный поиск.
Работа
Булевская переменная ИЛИlong
Формат
lor
Формы
lor = 129 (0x81)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типlong
. Они выталкиваются от стека операнда. Along
результат вычисляется, беря поразрядное содержащее ИЛИ value1 и value2. Результат продвигается на стек операнда.
Работа
Остатокlong
Формат
lrem
Формы
lrem = 113 (0x71)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типlong
. Значения выталкиваются от стека операнда.long
результатом является value1 - (value1 / value2) * value2. Результат продвигается на стек операнда.
Результат lrem инструкции так, что (a
/b
)*b
+ (a%b
) равноa
. Эти идентификационные данные содержат даже в особом случае, в котором дивиденд является отрицаниемlong
из самой большой величины для ее типа и делителя -1
(остаток0
). Это следует из этого правила, что результат работы остатка может быть отрицательным, только если дивиденд отрицателен и может быть положительным, только если дивиденд положителен; кроме того величина результата всегда является меньше чем величина делителя.
Исключение на этапе выполнения
Если значение делителя для along
оператор остатка0
, lrem бросаетArithmeticException
.
Работа
Возвратитьсяlong
от метода
Формат
lreturn
Формы
lreturn = 173 (0xad)
Стек операнда
..., оцените [пустой]
Описание
У текущего метода должен быть тип возвратаlong
. Значение должно иметь типlong
. Если текущий метод является asynchronized
метод, монитор, полученный или повторно введенный на вызове метода, выпускается или выходится (соответственно) как будто выполнением monitorexit инструкции. Если никакое исключение не выдается, значение выталкивается от стека операнда текущего фрейма (§3.6) и продвигается на стек операнда фрейма invoker. Любые другие значения на стеке операнда текущего метода отбрасываются.
Интерпретатор тогда возвращает управление invoker метода, восстанавливая фрейм invoker.
Исключения на этапе выполнения
Если текущий метод является asynchronized
метод и текущий поток не являются владельцем монитора, полученного или повторно введенного на вызове метода, lreturn бросаетIllegalMonitorStateException
. Это может произойти, например, если asynchronized
метод содержит monitorexit инструкцию, но никакую monitorenter инструкцию, на объекте, на котором синхронизируется метод.
Иначе, если реализация виртуальной машины осуществляет правила о структурированном использовании блокировок, описанных в Разделе 8.13 и если первое из тех правил нарушается во время вызова текущего метода, то lreturn бросает IllegalMonitorStateException
.
Работа
Сдвиг уехал
Формат
lshl
long
Формы
lshl = 121 (0x79)
Стек операнда
..., value1, value2..., результат
Описание
value1 должен иметь типlong
, и value2 должен иметь типint
. Значения выталкиваются от стека операнда. Along
результат вычисляется, смещаясь value1 оставленный s позициями двоичного разряда, где s составляет низкие 6 битов value2. Результат продвигается на стек операнда.
Примечания
Это эквивалентно (даже если переполнение происходит) к умножению 2 к питанию s. Расстояние сдвига, фактически используемое, находится поэтому всегда в диапазоне от 0 до 63, включительно, как будто value2 были подвергнуты поразрядному логическому, И с маской оценивают 0x3f.
Работа
Право арифметического сдвигаlong
Формат
lshr
Формы
lshr = 123 (0x7b)
Стек операнда
..., value1, value2..., результат
Описание
value1 должен иметь типlong
, и value2 должен иметь типint
. Значения выталкиваются от стека операнда. Along
результат вычисляется, смещаясь value1 прямо s позициями двоичного разряда с расширением знака, где s является значением низких 6 битов value2. Результат продвигается на стек операнда.
Примечания
Получающееся значение, где s является value2 & 0x3f. Для неотрицательного value1 это эквивалентно усечениюlong
подразделение 2 к питаниюs
. Расстояние сдвига, фактически используемое, находится поэтому всегда в диапазоне от 0 до 63, включительно, как будто value2 были подвергнуты поразрядному логическому, И с маской оценивают 0x3f.
Работа
Хранилищеlong
в локальную переменную
Формат
lstore индекс
Формы
lstore = 55 (0x37)
Стек операнда
..., значение...
Описание
Индекс является байтом без знака. И индекс и индекс + 1 должны быть индексами в массив локальной переменной текущего фрейма (§3.6). Значение на вершине стека операнда должно иметь тип long
. Это выталкивается от стека операнда, и локальные переменные по индексу и индексу + 1 устанавливаются оценить.
Примечания
lstore код операции может использоваться в соединении с широкой инструкцией, чтобы получить доступ к локальной переменной, используя двухбайтовый индекс без знака.
Работа
Хранилищеlong
в локальную переменную
Формат
lstore _ <n>
Формы
lstore_0 = 63 (0x3f) lstore_1 = 64 (0x40) lstore_2 = 65 (0x41) lstore_3 = 66 (0x42)
Стек операнда
..., значение...
Описание
И <n> и <n> + 1 должны быть индексами в массив локальной переменной текущего фрейма (§3.6). Значение на вершине стека операнда должно иметь тип long
. Это выталкивается от стека операнда, и локальные переменные в <n> и <n> + 1 устанавливаются оценить.
Примечания
Каждый из lstore _ <n> инструкции является тем же самым как lstore с индексом <n>, за исключением того, что операнд <n> неявен.
Работа
Вычестьlong
Формат
lsub
Формы
lsub = 101 (0x65)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типlong
. Значения выталкиваются от стека операнда.long
результатом является value1 - value2. Результат продвигается на стек операнда.
Дляlong
вычитание,a
-b
приводит к тому же самому результату какa
+(
-b)
. Дляlong
значения, вычитание от нуля является тем же самым как отрицанием.
Результатом являются 64 бита младшего разряда истинного математического результата в достаточно широком two's-дополнительном формате, представленном как значение типа long
. Если переполнение происходит, то знак результата, возможно, не то же самое как знак математической суммы двух значений.
Несмотря на то, что переполнение может произойти, выполнение lsub инструкции никогда не бросает исключение на этапе выполнения.
Работа
Право логического сдвигаlong
Формат
lushr
Формы
lushr = 125 (0x7d)
Стек операнда
..., value1, value2..., результат
Описание
value1 должен иметь типlong
, и value2 должен иметь типint
. Значения выталкиваются от стека операнда. Along
результат вычисляется, смещаясь value1 право логически (с дополнением нулями) количеством, обозначенным на низкие 6 битов value2. Результат продвигается на стек операнда.
Примечания
Если value1 положителен, и s является value2 & 0x3f, результатом является то же самое как тот из value1>> s; если value1 отрицателен, результат равен значению выражения (value1>> s) + (2L << ~s). The addition of the (2L << ~s) term cancels out the propagated sign bit. The shift distance actually used is always in the range 0 to 63, inclusive.
Работа
Булев XORlong
Формат
lxor
Формы
lxor = 131 (0x83)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типlong
. Они выталкиваются от стека операнда. Along
результат вычисляется, беря битовое исключающее "ИЛИ" value1 и value2. Результат продвигается на стек операнда.
Содержание | Предыдущий | Следующий | Индекс
Спецификация Виртуальной машины JavaTM
Авторское право © Sun Microsystems, Inc 1999 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к jvm@java.sun.com