Расширение знака (иногда сокращенно секст , особенно в мнемонике ) — это операция в компьютерной арифметике по увеличению количества битов двоичного числа с сохранением знака числа (положительный/отрицательный) и значения. Это делается путем добавления цифр к старшей значащей стороне числа в соответствии с процедурой, зависящей от конкретного используемого представления числа со знаком .
Например, если для представления числа " 00 1010
" (десятичное положительное число 10) используется шесть бит, а операция расширения знака увеличивает длину слова до 16 бит, то новое представление будет просто " 0000 0000 0000 1010
". Таким образом, сохраняются как значение, так и тот факт, что значение было положительным.
Если десять бит используются для представления значения " 11 1111 0001
" (десятичное отрицательное 15) с использованием дополнения до двух , и этот знак расширен до 16 бит, новое представление будет " 1111 1111 1111 0001
". Таким образом, путем дополнения левой стороны единицами отрицательный знак и значение исходного числа сохраняются.
Например, в наборе инструкций Intel x86 есть два способа выполнения знакового расширения:
cbw
, cwd
, cwde
, и cdq
: преобразовать байт в слово, слово в двойное слово, слово в расширенное двойное слово и двойное слово в четверное слово соответственно (в контексте x86 байт имеет 8 бит, слово — 16 бит, двойное слово и расширенное двойное слово — 32 бита, а четверное слово — 64 бита);movsx
инструкций («движение с расширением знака»).Аналогичная концепция — нулевое расширение (иногда сокращенно zext ). В операции перемещения или преобразования нулевое расширение означает установку старших битов назначения в ноль, а не установку их в копию самого старшего бита источника. Если источником операции является беззнаковое число, то нулевое расширение обычно является правильным способом переместить его в большее поле, сохраняя его числовое значение, в то время как знаковое расширение является правильным для знаковых чисел.
В наборах инструкций x86 и x64 movzx
эту функцию выполняет инструкция («переместить с нулевым расширением»). Например, movzx ebx, al
копирует байт из al
регистра в младший байт ebx
и затем заполняет оставшиеся байты ebx
нулями.
На x64 большинство инструкций, которые записывают в нижние 32 бита любого регистра общего назначения, обнулят верхнюю половину регистра назначения. Например, инструкция mov eax, 1234
очистит верхние 32 бита регистра rax
[a] .