배움 저장소
[C/C++] Left Shift and Right Shift 본문
이 글에서는 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
'Programming Language > C++' 카테고리의 다른 글
[홍정모의 따라하며 배우는 C++] 0. 시작해봅시다. (0) | 2021.12.10 |
---|---|
[C++] Template (0) | 2021.11.13 |
[C++] unique_ptr, shared_ptr, weak_ptr (0) | 2021.11.07 |
부호가 있는 이진수 1000은 0일까? (0) | 2021.10.19 |
[C++] Iterator (0) | 2021.10.09 |
Comments