C 비트 쉬프트 signed - sonkoni/Koni-Wiki GitHub Wiki
부호있는 자료형은 비트 쉬프트에 주의해야 한다.
- 부호있는 자료형의 비트 쉬프트
>>는 주의해야 한다. 왜냐면 빈 공간이 부호비트로 채워지기 때문이다. - 비트 쉬프트
<<는 signed 나 unsigned 나 동일하게0으로 채워진다. 그러나 signed 에서는 부호필드에 자리잡은0/1에 따라 정수기호가 바뀐다.
#include <stdio.h>
int main(int argc, char *argv[]) {
unsigned char num1 = 131; // 1000 0011
char num2 = -125; // 1000 0011
printf("%u\n", num1 >> 5); // 0000 0100 (4)
printf("%d\n", num2 >> 5); // 1111 1100 (-4)
unsigned char d1 = 0b11110001; // 241
char d2 = 0b11110001; // -15
d1 <<= 4; d2 <<= 4;
printf("%u, %d\n", d1, d2); // 0001 0000 (16)
return 0;
} unsigned char char
------------------------------------------
unsigned 부호비트가 없다. ┌> signed는 첫 번째 비트가 부호비트이다.
┌─ 10000011 (131) ┌─ I0000011 (-125)
>> └▶ O1000001 └▶ I000001
>> └▶ OO100000 └▶ II00000
>> └▶ OOO10000 └▶ III0000
>> └▶ OOOO1000 └▶ IIII000
>> └▶ OOOOO100 (4) └▶ IIIII00 (-4)
unsigned 부호비트가 없다. ┌> signed는 첫 번째 비트가 부호비트이다.
┌─ 11110001 (241) ┌─ I1110001 (-15)
<< └▶ 1110001O └▶ 1110001O
<< └▶ 110001OO └▶ 110001OO
<< └▶ 10001OOO └▶ 10001OOO
<< └▶ 0001OOOO (16) └▶ 0001OOOO (16); 부호비트가 0 이 되면서 양수로 바뀐다