C 언어 기초

'char c = 200;'으로 한 c를 printf의 %d로 표시하는 프로그램을 x86-64 Linux용 gcc로 컴파일하여 실행하면 −56, Arm Linux용 gcc에서는 200이 표시되었다. 차이가 생기는 이유로 올바른 것은?

  1. AArm은 빅 엔디언이므로 바이트의 순서가 거꾸로 읽히기 때문에
  2. Bsigned도 unsigned도 붙이지 않은 char가 부호 있는 형인지 부호 없는 형인지는 처리계가 정하며, x86-64에서는 부호 있는 형, Arm에서는 부호 없는 형으로 되어 있기 때문에
  3. 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를 사용하여 부호의 취급을 분명히 합니다.

이 분야 연습하기 분야로 돌아가기

C 언어 기초의 다른 문제

  1. &&와 ||의 오른쪽에 b++를 쓴 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  2. break가 없는 case를 포함하는 위의 switch 문을 실행했을 때의 출력으로 올바른 것은?
  3. 위의 프로그램을 실행했을 때의 출력으로 올바른 것은?
  4. 위의 함수 f를 3번 연속으로 호출했을 때, 세 번째 반환값으로 올바른 것은?
  5. C 언어에서 (1) 함수 안에서 static을 붙이지 않고 선언한 지역 변수, (2) malloc으로 확보한 영역, (3) 함수 밖에서 선언한 변수가 각각 존재하는 기간(수명)의 조합으로 올바른 것은?