C언어에서요 .1바이트 를 %x로 출력할떄

puresupe의 이미지
1180
points
0
points

char ch = 0xAB;
printf("%x",ch);
를 실행하면

ffffffab으로 찍혀서나오는데요

반면
unsigned char ch = 0xAB;
prinf("%x",ch);
를하면
ab
정상적으로 찍히구요.

제가 잘 생각해보니까.
추측이.
%x가. 4바이트 출력 포맷인데(정수형 변수)
1바이트형 데이터타입(char)을 출력할때 형변환이 이루어져서
char -> int로 이루어졌는데

이때. signed일때는 mathematical shift가 일어나고
unsigned일때는 logical shift가 일어나서

0xab가 signed일때는 최상위 비트가 1이니까. 이게 mathematical shift가 일어나서 1111111으로 확장되서 ffffffab라는 결과가나오고...

이렇게 생각해봤는데

맞는건가요?

임수서룬뫼의 이미지
37537
points

복잡하게 생각하시지

0
points

복잡하게 생각하시지 마세요.

(char) 0xab = (int) -85인데 %x는 unsigned int를 위한 형식이죠.
그런데 가변 인자 함수에서는 승급을 제외한 형변환이 되지 않습니다.
따라서 (int) -85 = (unsigned int) 0xffffffab (내부 표현)를 그대로 찍은 겁니다.
(물론 형변환이 되어 봤자 결과는 같겠지만...)

반면, (unsigned char) 0xab = (int) 170인데 이것은 (unsigned int) 170과 내부 표현이 같습니다.
잘 찍히죠.



한말글 프로그래밍 언어 "열정" http://me-lang.wo.tc

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.