符號擴充
符號擴充(又名符號擴展)是計算機算術中,在保留數字的符號(正負性)及數值的情況下,增加二進制數字位數的操作。此操作根據使用的特定有符號數處理方式,通過在數字的最高有效位端添加位數的方式完成。
舉個例子,若計算機使用六位二進制數表示數字「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. ISBN 0-13-140539-X.