24.2 시프트 연산으로 자릿수를 넘어서는 경우 알아보기

지금까지 시프트 연산자를 사용할 때 주어진 자료형 안에서 왼쪽, 오른쪽으로 이동했습니다. 그렇다면 시프트 연산자를 사용하여 비트가 첫째 자리나 마지막 자리를 넘어설 때까지 이동하면 어떻게 될까요?

bitwise_shift_overflow.c

#include <stdio.h>
 
int main()
{
    unsigned char num1 = 240;    // 240: 1111 0000
    unsigned char num2 = 15;     //  15: 0000 1111
 
    unsigned char num3, num4;
 
    num3 = num1 << 2;    // num1의 비트 값을 왼쪽으로 2번 이동
    num4 = num2 >> 2;    // num2의 비트 값을 오른쪽으로 2번 이동
 
    printf("%u\n", num3);    // 192: 1100 0000: 맨 앞의 11이 사라져서 11000000이 됨
    printf("%u\n", num4);    //   3: 0000 0011: 맨 뒤의 11이 사라져서 00000011이 됨
 
    return 0;
}

실행 결과

192
3

1111 0000(240)을 왼쪽으로 2번 이동시키면 맨 앞의 11은 사라져서 1100 0000(192)이 됩니다.

1111 0000(240)
_________ << 2
1100 0000(192)

마찬가지로 0000 1111(15)을 오른쪽으로 2번 이동시키면 맨 뒤의 11은 사라져서 0000 0011(3)이 됩니다.

0000 1111(15)
_________ >> 2
0000 0011(3)

즉, 비트에서 첫째 자리나 마지막 자리를 넘어서는 비트는 그대로 사라집니다.

참고 | 최상위 비트, 최하위 비트

비트에서 첫 번째 비트를 최상위 비트(Most Significant Bit, MSB), 마지막 비트를 최하위 비트(Least Siginificant Bit, LSB)라고 부릅니다.

그림 24‑1 최상위 비트, 최하위 비트