C 언어 기초

임베디드 프로그램에서 32비트 주변 장치 레지스터의 값을 넣는 변수를 unsigned int가 아니라 stdint.h의 uint32_t로 선언하는 경우가 많다. 주된 이유로 올바른 것은?

  1. Auint32_t는 값이 최댓값을 넘었을 때 0으로 돌아가지 않고 최댓값에서 멈추기(포화하기) 때문에
  2. Buint32_t로 선언한 변수는 컴파일러의 최적화로 읽기/쓰기가 생략되지 않게 되기 때문에
  3. Cunsigned int의 크기는 처리계에 따라 다르지만, uint32_t는 정확히 32비트의 부호 없는 정수로 정해져 있기 때문에
정답과 해설 보기

정답: C. unsigned int의 크기는 처리계에 따라 다르지만, uint32_t는 정확히 32비트의 부호 없는 정수로 정해져 있기 때문에

stdint.h의 uint8_t, uint16_t, uint32_t, int32_t 등은 비트 수가 이름 그대로 정해진 정수형(고정 폭 정수형)입니다. unsigned int는 16비트일 수도 32비트일 수도 있으므로, 레지스터의 폭에 맞추고 싶은 경우나 통신 데이터의 형식을 정하는 경우에 고정 폭 형을 사용하면 다른 CPU로 옮겨도 의미가 바뀌지 않습니다. uint32_t는 다른 부호 없는 정수형과 마찬가지로 넘치면 2³²로 나눈 나머지 값이 됩니다. 읽기/쓰기를 생략하지 못하게 하려면 형과는 별도로 volatile을 붙입니다.

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

C 언어 기초의 다른 문제

  1. 정수끼리의 나눗셈을 포함하는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  2. 전위와 후위 ++를 사용한 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  3. if 문의 조건에 =를 쓴 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  4. 레지스터 값 reg의 비트 2가 1인지를 조사할 생각으로 위의 코드를 작성했다. 실행했을 때의 결과로 올바른 것은?
  5. uint8_t는 8비트의 부호 없는 정수형이다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?