부호 확장

부호 확장(Sign extension, 니모닉에서 특히 sext로 약칭)은 컴퓨터 산술에서 숫자의 이진수의 비트 수를 늘리면서 숫자의 부호(양수/음수)와 값을 보존하는 연산이다. 이는 사용되는 특정 부호 있는 숫자 표현에 따라 달라지는 절차에 따라 숫자의 최상위 쪽에 숫자를 추가하여 수행된다.

예를 들어, "00 1010"(10진수 양수 10)을 나타내는 데 6비트가 사용되고 부호 확장 연산으로 워드 길이가 16비트로 늘어나면 새 표현은 단순히 "0000 0000 0000 1010"이 된다. 따라서 값과 값이 양수였다는 사실이 모두 유지된다.

2의 보수를 사용하여 "11 1111 0001"(10진수 음수 15) 값을 나타내는 데 10비트가 사용되고 이를 16비트로 부호 확장하면 새 표현은 "1111 1111 1111 0001"이 된다. 따라서 왼쪽을 1로 채워서 음수 부호와 원래 숫자의 값이 유지된다.

예를 들어, 인텔 x86 명령어 세트에는 부호 확장을 수행하는 두 가지 방법이 있다.
 cbw, cwd, cwde, cdq 명령어를 사용: 각각 바이트를 워드로, 워드를 더블워드로, 워드를 확장 더블워드로, 더블워드를 쿼드워드로 변환(x86 컨텍스트에서 바이트는 8비트, 워드는 16비트, 더블워드 및 확장 더블워드는 32비트, 쿼드워드는 64비트);
 movsx("부호 확장 이동") 명령어 계열에 의해 수행되는 부호 확장 이동 중 하나를 사용.

제로 확장
유사한 개념은 제로 확장(때로는 zext로 약칭됨)이다. 이동 또는 변환 연산에서 제로 확장은 대상의 상위 비트를 0으로 설정하는 것을 의미하며, 소스의 최상위 비트의 복사본으로 설정하는 것이 아니다. 연산의 소스가 부호 없는 숫자이면 제로 확장은 일반적으로 숫자 값을 보존하면서 더 큰 필드로 이동하는 올바른 방법이며, 부호 있는 숫자에는 부호 확장이 올바르다.

x86 및 x64 명령어 세트에서 movzx 명령어("제로 확장 이동")는 이 기능을 수행한다. 예를 들어, movzx ebx, al은 al 레지스터에서 ebx의 하위 바이트로 바이트를 복사한 다음 ebx의 나머지 바이트를 0으로 채운다.

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. .

참고

분류:이진 산술