[C 초보질문] << 연산자에 대해.

alwaysN00b의 이미지

안녕하세요. 초보라.. 검색해 봐도 잘못찾겠더라구요..

char buf;

buf = 24; 이건 00011000 저장이 되죠?
buf = 24 << 1 ; 이건 00110000 이렇게 되죠?

buf = 24 << 356; 이건 어떻게 되나요?

그리고
buf[1] = ((16 << num) & 0xff000000) >> 24; 이건요?

상수(24)가 내부적으로 어떻게 처리 되는지 알고 싶습니다.
(예를 들면 정수형으로처리)

맹고이의 이미지

직접 해보면 되는 것 아닌가요...?

alwaysN00b의 이미지

어느 정도 해보고 질문 올린것입니다.

분명히 char type의 변수에 값을 넣었는데

char buf;
buf = (24 << 356);
printf("%x \n",buf);

했을때 뭐가 나올것 같습니까?

ffffff00 이 나왔던것 같습니다. (지금 학교라 결과는 정확히 몇자리 인지 모르겠습니다)

char type 변수를 hex 값으로 출력하는데 2자리 이상 나오는데 이 초보가
궁금 하지 않겠습니까?

언제나 시작

Prentice의 이미지

Quote:
The result of the shift operation is undefined if the right operand is negative or if its value is greater than the number of bits in an int.

결과를 예측할 수 없을 것 같습니다. int보다 크게 shift 하지 마세요..
pynoos의 이미지

alwaysN00b wrote:
어느 정도 해보고 질문 올린것입니다.

분명히 char type의 변수에 값을 넣었는데

char buf;
buf = (24 << 356);
printf("%x \n",buf);

했을때 뭐가 나올것 같습니까?

ffffff00 이 나왔던것 같습니다. (지금 학교라 결과는 정확히 몇자리 인지 모르겠습니다)

char type 변수를 hex 값으로 출력하는데 2자리 이상 나오는데 이 초보가
궁금 하지 않겠습니까?

buf 는 printf 로 넘어갈때 (int) 로 암묵적인 형변환이 일어 납니다.

맹고이의 이미지

[myunggoni@kimjung myunggoni]$ cat test.c
#include <stdio.h>

int main() {
        char ch;

        ch = (24 << 356);

        printf("%x\n", ch);

        return 0;
}
[myunggoni@kimjung myunggoni]$ gcc test.c
test.c: In function `main':
test.c:6: warning: left shift count >= width of type
[myunggoni@kimjung myunggoni]$ ./a.out
0

저는 경고가 나오네요. 그리고 char가 int 형으로 implicit casting
되어서 4 바이트로 나오는 것 같습니다.
비트필드 공용체를 만들어서 테스트해보는 게 어떨까요.

haze11의 이미지

비트 쉬프트에 대해서는 C보다는 어셈으로 공부하는게 더 쉬울거 같네요.

어셈에서 쉬프트가 어떻게 되는지 이해한다면 C에서는 어렵지 않을거 같네요.

alwaysN00b의 이미지

아... 답변들 감사드립니다.

제가 생각이 좀 짧았네요. 예전에 공부하다 다시 할려고 하니..
(char 가 1byte , int 2byte 인줄 알고... 부끄..-_- :oops: ;;)

이해 되었습니다. 답변들 감사드립니다.

언제나 시작