형식 지정자(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는 진법 자동 판별이 필요한 특수한 경우에만 활용하는 것이 좋습니다.