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 이 되면서 양수로 바뀐다
⚠️ **GitHub.com Fallback** ⚠️