C 언어 기초

int와 unsigned int는 32비트로 한다. 다음 중 C 언어 규격에서 미정의 동작이 되는 것은?

  1. Aunsigned int 변수의 값이 최댓값 4294967295일 때 1을 더한다
  2. Bint의 음수 값을 >>로 오른쪽으로 1비트 시프트한다
  3. Cint 변수의 값이 최댓값 2147483647일 때 1을 더한다
정답과 해설 보기

정답: C. int 변수의 값이 최댓값 2147483647일 때 1을 더한다

int의 2147483647 + 1처럼 부호 있는 정수 연산의 결과가 나타낼 수 있는 범위를 넘는 것은 미정의 동작입니다. 부호 없는 정수의 연산은 2³²로 나눈 나머지로 돌아간다고 정해져 있으므로, 4294967295 + 1은 0이 되며 미정의 동작이 아닙니다. 음수 값의 오른쪽 시프트는 산술 시프트가 될지 논리 시프트가 될지를 처리계가 정하는 처리계 정의 동작으로, gcc에서는 산술 시프트가 됩니다. 한편, 음수 값의 왼쪽 시프트는 미정의 동작입니다.

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

C 언어 기초의 다른 문제

  1. 위의 함수를 gcc로 최적화를 켜고 컴파일하면 if (p == NULL)의 판정이 삭제되는 경우가 있다. 그 이유로 올바른 것은?
  2. C 언어 규격에서 int형의 크기에 대해 정해져 있는 것으로 올바른 것은?
  3. 임베디드 프로그램에서 32비트 주변 장치 레지스터의 값을 넣는 변수를 unsigned int가 아니라 stdint.h의 uint32_t로 선언하는 경우가 많다. 주된 이유로 올바른 것은?
  4. 정수끼리의 나눗셈을 포함하는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  5. 전위와 후위 ++를 사용한 위의 코드를 실행했을 때의 출력으로 올바른 것은?