배움 저장소

[C/C++] Left Shift and Right Shift 본문

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

 

Comments