Programming Language/C++
[C/C++] Left Shift and Right Shift
시옷지읏
2021. 11. 11. 15:45
이 글에서는 left shift와 right shift 연산이 어떤 차이가 있는지 다룬다. 이러한 차이가 코드에서 예기치 못한 상황을 만들 수 있다. left shift와 right shift 연산의 차이를 알아보자.
1. signed && 음수
signed값은 맨 앞 bit가 양수 / 음수를 나타낸다. 위 값은 음수이므로 >> 연산자를 사용할 때 부호 값은 그대로 유지된다.
2. unsigned || signed && 양수
위 상황은 unsgined 타입이거나 signed 타입일 경우 양수 값을 가질 때이다. 이 때 >> 연산자를 사용하면 부호 값은 계산되지 않는다.
따라서 다음과 같은 상황을 이해할 수 있다.
char x = CHAR_MAX;
printf("%i\n", x); // => 127
char tmp = x << 1;
printf("%i\n", tmp); // => -2
char y = tmp >> 1;
printf("%i\n", y); // => -1
char z = (x << 1) >> 1;
printf("%i\n", z); // => 127
127 값을 bit 왼쪽으로 이동하고 값을 저장한 후 bit을 오른쪽으로 이동하면 -1이다.
127 값을 bit 왼쪽으로 이동하고 값을 저장하지 않고 바로 오른쪽으로 이동하면 127이다.
양수와 음수의 shift operation이 다르게 작동하기 때문이다.
참고
https://stackoverflow.com/questions/7522346/right-shift-and-signed-integer