char 데이터형의 shift 결과가 신기하게 나오네요 ^^;

alwaysrainy의 이미지

  #  cat shift.c

#include <stdio.h>


int main()
{
        int       i, v = 0;
        char    ch = 0;

        for (i = 0; i < 9; i++)
        {
                ch = v;
                //printf("[i=%d] v => %0x\n", i, v);
                printf("ch's value => %0x [%d]\n", ch, ch);
                v <<= 1;
                v = v | 0x1;
        }

        return 0;
}

  #  gcc shift.c -Wall
  #  ./a.out
ch's value => 0 [0]
ch's value => 1 [1]
ch's value => 3 [3]
ch's value => 7 [7]
ch's value => f [15]
ch's value => 1f [31]
ch's value => 3f [63]
ch's value => 7f [127]
ch's value => ffffffff [-1]

  #  gcc --version
gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  #

참 재미있는 결과인데요 ^^ 여기서 마지막 결과과 ff가 아니고 왜 ffffffff
(4byte) 결과로 출려되는 것일 까요? 단순한 컴파일러 버그인건가요?

vacancy의 이미지

signed char 이다보니,
shift하고 %d로 찍는 과정에서
sign extension이 일어나는 것 같습니다.

4byte 0xFFFFFFFF이든, 1byte 0xFF이든
-1이라는 것은 동일하니까요.