Введение
Операция увеличения количества бит числа при сохранении знака и значения числа. Расширение знака (иногда сокращаемое как 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 ("перемещение с расширением знака").
Sign extension (sometimes abbreviated as sext, particularly in mnemonics) is the operation, in computer arithmetic, of increasing the number of bits of a binary number while preserving the number's sign (positive/negative) and value. This is done by appending digits to the most significant side of the number, following a procedure dependent on the particular signed number representation used. For example, if six bits are used to represent the number "00 1010" (decimal positive 10) and the sign extend operation increases the word length to 16 bits, then the new representation is simply "0000 0000 0000 1010". Thus, both the value and the fact that the value was positive are maintained. If ten bits are used to represent the value "11 1111 0001" (decimal negative 15) using two's complement, and this is sign extended to 16 bits, the new representation is "1111 1111 1111 0001". Thus, by padding the left side with ones, the negative sign and the value of the original number are maintained. In the Intel x86 instruction set, for example, there are two ways of doing sign extension:
using the instructions cbw, cwd, cwde, and cdq: convert byte to word, word to doubleword, word to extended doubleword, and doubleword to quadword, respectively (in the x86 context a byte has 8 bits, a word 16 bits, a doubleword and extended doubleword 32 bits, and a quadword 64 bits);
using one of the sign extended moves, accomplished by the movsx ("move with sign extension") family of instructions.
Расширение нуля
Похожая концепция — нулевое расширение (иногда сокращается как zext). В операции перемещения или преобразования нулевое расширение означает установку старших битов целевого регистра в ноль, а не копирование старшего бита исходного регистра. Если исходные данные — беззнаковое число, то нулевое расширение обычно является правильным способом перемещения его в более широкий регистр с сохранением числового значения, в то время как расширение знака подходит для знаковых чисел. В наборах инструкций x86 и x64 эта функция выполняется инструкцией `movzx` ("перемещение с нулевым расширением"). Например, `movzx ebx, al` копирует байт из регистра `al` в младший байт регистра `ebx`, а затем заполняет остальные байты `ebx` нулями. В x64 большинство инструкций, записывающих во все младшие 32 бита любого из регистров общего назначения, обнуляют старшую половину целевого регистра. Например, инструкция `mov eax, 1234` очистит старшие 32 бита регистра `rax`.