Введение

Операция увеличения количества бит числа при сохранении знака и значения числа. Расширение знака (иногда сокращаемое как sext, особенно в мнемониках) — это операция в компьютерной арифметике, заключающаяся в увеличении количества бит двоичного числа при сохранении знака (положительного/отрицательного) и значения числа. Это достигается путем добавления цифр к старшей значащей стороне числа в соответствии с процедурой, зависящей от конкретного используемого представления чисел. Например, если для представления числа "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`.