符號擴充

符號擴充(又名符號擴展)是計算機算術中,在保留數字的符號(正負性)及數值的情況下,增加二進制數字位數的操作。此操作根據使用的特定有符號數處理方式,通過在數字的最高有效位端添加位數的方式完成。

舉個例子,若計算機使用六位二進制數表示數字「00 1010」(十進制的正10),且此數字需要將字長符號擴充至十六位,則擴充後的值為「0000 0000 0000 1010」。此時,數值與符號均保留了下來。

若計算機使用十位數及二補數表示數字「11 1111 0001」(十進制的負15),且此值需要擴充至十六位,則擴充後的值為「1111 1111 1111 0001」。 此時,負號及原數字數值通過將左側填充為1的方式保留了下來。

英特爾x86指令集英語x86 instruction listings中,符號擴充有兩種方式:

  • 使用指令cbwcwdcwdecdq:分別將字節轉化為字、字轉化為雙字、字轉化為擴充雙字、雙字轉化為四倍長字(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. ISBN 0-13-140539-X.