Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어에서 %d와 %i 형식 지정자의 차이점 완벽 정리


형식 지정자(Format Specifier)란?

C 언어에서 %d%i는 모두 정수형 데이터를 입출력할 때 사용하는 형식 지정자입니다. 두 지정자는 표준에서 사실상 동일한 의미로 정의되어 있으며, 변수를 부호 있는 정수(signed integer)로 다룬다는 점에서 같습니다.

printf()에서의 차이: 없음

printf() 함수에서는 %d와 %i의 동작에 어떠한 차이도 없습니다. 숫자를 출력할 때 어느 쪽을 사용하더라도 완전히 동일한 결과가 나옵니다.

scanf()에서의 차이: 진법 해석 방식

차이가 발생하는 곳은 바로 scanf() 함수입니다.

  • %d: 입력값을 항상 10진수로 해석합니다.
  • %i: 입력값의 접두사를 기준으로 진법을 자동으로 판별합니다. (예: 0x로 시작하면 16진수, 0으로 시작하면 8진수)

예제 코드 (C)

#include <stdio.h>

int main() {
    int num1, num2;
    int num3, num4;

    scanf("%i%d", &num1, &num2);
    printf("%i\t%d\n", num1, num2);

    num3 = 010;
    num4 = 010;

    printf("%i\t%d", num3, num4);
    return 0;
}

실행 결과 분석

위 코드에서 010은 소스 코드상 8진수 표기입니다. 컴파일러는 이를 8진수로 해석해 10진수 값 8로 저장하므로, printf()에서는 %i든 %d든 모두 8이 출력됩니다.

반면 scanf()로 직접 010을 입력하면 상황이 달라집니다.

  • %d로 읽으면 → 10진수 10으로 저장
  • %i로 읽으면 → 맨 앞의 0을 보고 8진수로 판단해 8로 저장

정리 및 사용 권장 사항

  • printf()에서는 %d와 %i가 완전히 동일하게 동작합니다.
  • scanf()에서 %i는 진법(8진수, 10진수, 16진수)을 자동으로 판별하지만, %d는 오직 10진수만 받아들입니다.
  • 특별한 이유가 없다면 가독성과 안전성을 위해 %d 사용이 권장됩니다. %i는 진법 자동 판별이 필요한 특수한 경우에만 활용하는 것이 좋습니다.