C 언어 기초

union { uint32_t w; uint8_t b[4]; } u;
u.w = 0x12345678;
printf("%02X %02X\n", u.b[0], u.b[1]);

uint32_t는 32비트, uint8_t는 8비트의 부호 없는 정수형이며, 리틀 엔디언 환경으로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?

  1. A12 34
  2. B78 56
  3. C87 65
정답과 해설 보기

정답: B. 78 56

공용체(union)의 멤버는 같은 주소부터 겹쳐서 놓이므로, u.b[0]~u.b[3]은 u.w의 4바이트를 각각 나타냅니다. 리틀 엔디언에서는 최하위 바이트를 가장 작은 주소에 두므로, 0x12345678은 작은 주소부터 78, 56, 34, 12의 순서로 나열됩니다. 따라서 u.b[0]은 0x78, u.b[1]은 0x56입니다. 쓴 것과 다른 멤버로 읽는 것은 이처럼 바이트의 순서를 조사하는 데 사용할 수 있지만, 결과는 엔디언에 따라 달라집니다.

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

C 언어 기초의 다른 문제

  1. 3비트의 비트 필드에 9를 넣는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  2. #define으로 정의한 매크로 SQUARE를 사용하는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  3. 헤더 파일 sensor.h를 위와 같이 작성했다. #ifndef, #define, #endif의 세 줄의 목적으로 올바른 것은?
  4. 위의 코드를 main 함수 안에 써서 실행했을 때의 출력으로 올바른 것은?
  5. 마이컴의 출력 레지스터를 위와 같이 선언하여 사용하고 있다. 이 선언에 대한 설명으로 올바른 것은?