符号扩充

符号扩充（又名符号扩展）是计算机算术中，在保留数字的符号（正负性）及数值的情况下，增加二进制数字位数的操作。此操作根据使用的特定有符號數處理方式，通过在数字的最高有效位端添加位数的方式完成。

举个例子，若计算机使用六位二进制数表示数字“00 1010”（十进制的正10），且此数字需要将字长符号扩充至十六位，则扩充后的值为“0000 0000 0000 1010”。此时，数值与符号均保留了下来。

若计算机使用十位数及二補數表示数字“11 1111 0001”（十进制的负15），且此值需要扩充至十六位，则扩充后的值为“1111 1111 1111 0001”。 此时，负号及原数字数值通过将左侧填充为1的方式保留了下来。

在英特尔的中，符号扩充有两种方式：
 使用指令cbw、cwd、cwde及cdq：分别将字节转化为字、字转化为双字、字转化为扩充双字、双字转化为四倍长字（x86环境中，一个字节为8位、一个字16位、双字与扩充双字均为32位、四倍长字64位）；
 使用符号扩展移动指令，可通过movsx（“带符号移动”）指令族完成。

零扩展
零扩展是与符号扩展类似的概念。在移动操作或转换操作中，零扩展指的是将目标的高位数设置为零，而不是将高位数设置成原数字的最高有效位。零扩展通常用于将无符号数字移动至较大的字段中，同时保留其数值；而符号扩展通常用于有符号的数字。

在x86及x64指令集中，movzx指令（“使用零扩展移动”）将执行零扩展移动。举个例子，movzx ebx, al会复制al中的一个字节至ebx的低位字节，随后使用0填充ebx的剩余字节。

在x64平台上，大多数写入通用寄存器的低32位的指令将使用0填充目标寄存器的上半部分。举个例子，指令mov eax, 1234将清除rax寄存器的上32位。

参考文献
 Mano, Morris M.; Kime, Charles R. (2004). Logic and Computer Design Fundamentals (3rd ed.), pp 453. Pearson Prentice Hall. .

Category:二进制算术

de:Zweierkomplement#Vorzeichenerweiterung
ru:Дополнительный_код_(представление_числа)#Расширение_знака