C 언어 기초
'char c = 200;'으로 한 c를 printf의 %d로 표시하는 프로그램을 x86-64 Linux용 gcc로 컴파일하여 실행하면 −56, Arm Linux용 gcc에서는 200이 표시되었다. 차이가 생기는 이유로 올바른 것은?
- AArm은 빅 엔디언이므로 바이트의 순서가 거꾸로 읽히기 때문에
- Bsigned도 unsigned도 붙이지 않은 char가 부호 있는 형인지 부호 없는 형인지는 처리계가 정하며, x86-64에서는 부호 있는 형, Arm에서는 부호 없는 형으로 되어 있기 때문에
- Cx86-64의 char는 16비트이고, 상위 비트가 부호로 취급되기 때문에
정답과 해설 보기
정답: B. signed도 unsigned도 붙이지 않은 char가 부호 있는 형인지 부호 없는 형인지는 처리계가 정하며, x86-64에서는 부호 있는 형, Arm에서는 부호 없는 형으로 되어 있기 때문에
signed도 unsigned도 붙이지 않은 char가 부호 있는 형인지 부호 없는 형인지는 규격에서 정하지 않고 처리계에 맡겨져 있습니다(처리계 정의). x86-64 Linux에서는 char가 부호 있는 형이라 −128~127의 범위만 나타낼 수 있으며, 200을 넣으면 200 − 256 = −56이 됩니다. Arm이나 RISC-V의 Linux에서는 char가 부호 없는 형이라 200이 그대로 들어갑니다. 바이트 데이터를 다룰 때는 unsigned char나 uint8_t를 사용하여 부호의 취급을 분명히 합니다.