C 언어 기초

uint8_t a = 0x0F;
if (~a == 0xF0)
    printf("equal\n");
else
    printf("not equal\n");

uint8_t는 8비트의 부호 없는 정수형, int는 32비트로 한다. 위의 코드를 실행했을 때의 결과로 올바른 것은?

  1. Aequal이 표시된다
  2. Buint8_t의 값에는 ~를 사용할 수 없으므로 컴파일 오류가 된다
  3. Cnot equal이 표시된다
정답과 해설 보기

정답: C. not equal이 표시된다

~a를 계산하기 전에 a는 정수 승격에 의해 int인 0x0000000F로 변환됩니다. 따라서 ~a는 8비트의 0xF0이 아니라 32비트의 0xFFFFFFF0(int로는 −16)이 되어, 0xF0(240)과 같지 않습니다. 8비트로 비교하고 싶은 경우에는 (uint8_t)~a == 0xF0처럼 8비트 형으로 되돌린 후에 비교합니다. 레지스터 값을 반전해서 비교하는 처리에서 일어나기 쉬운 실수입니다.

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

C 언어 기초의 다른 문제

  1. int와 unsigned int는 32비트로 한다. 위의 코드를 실행했을 때의 결과로 올바른 것은?
  2. unsigned int는 32비트로 한다. 위의 코드를 실행했을 때의 동작으로 올바른 것은?
  3. 'char c = 200;'으로 한 c를 printf의 %d로 표시하는 프로그램을 x86-64 Linux용 gcc로 컴파일하여 실행하면 −56, Arm Linux용 gcc에서는 200이 표시되었다. 차이가 생기는 이유로 올바른 것은?
  4. &&와 ||의 오른쪽에 b++를 쓴 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  5. break가 없는 case를 포함하는 위의 switch 문을 실행했을 때의 출력으로 올바른 것은?