관리 메뉴

비전늅

[C언어] 형식지정자 float은 %f인데 integer는왜 %d일까 본문

Computer Languages/C language

[C언어] 형식지정자 float은 %f인데 integer는왜 %d일까

visionNoob 2017. 11. 23. 22:31

%i 에 관하여

문제해결을 위해 알고리즘을 공부하다보면 가장 기초는 바로 파일 입출력이다.

scanf, printf와 같은 입출력 함수 사용시 많이 사용하는것이 바로 형식지정자(format specifier)인데

자주 쓰는 형식지정자도 있지만  그중에서도 %i에 대해 궁금증이 생겼다. 

printf 함수를 이용하여 10진수 형태의 정수를 출력할때 간단하게 아래와 같이 사용할 수 있다. 


1
2
3
4
5
6
7
8
#include <cstdio>
 
int main(){
    int x = 10;
    printf("%d ",x);
    printf("%i",x);
    return 0;
}
cs

out : 10 10


printf에서 %d를 이용한 방법(line 1)  %i를 이용한 방법(line 2) 모두 동일한 출력을 보인다. 

과연 뭐하는 아이(i)일까... 


형식지정자가 어떤 포멧을 나타내는지 추론하는것은 굉장히 쉽다. 

예를들어 %f는 float을 %c는 character형식을 의미하는데, 

당연히 integer를 출력하는 형식지정자는 %d일까? 


%d 는 decimal을 나타내는 것이다. 더 정확하게 "signed decimal integer" 를 나타낸다. 


"%o" 가 "32비트 8진수"를 

"%x" 가 32비트 16진수"를 

나타내는 것 처럼 

"%d" 가 32비트 10진수를 의미하는 것이다. 


integer type에 대한 형식지정자는 %i가 맞다. 


따라서 변수 int x에 대해서, 


%d: 32비트 10진수로 출력해줘!

%i : 변수 x 를 integer type 으로 출력해줘!



라는 말이 되겠다. 다만 %i와 %d 는 scanf함수와 함께 사용시에 다른 동작을 보인다. 



1
2
3
4
5
6
7
8
9
10
11
#include <cstdio>
 
int main(){
    int x1, x2;
    scanf("%d",&x1);
    scanf("%i",&x2);
 
    printf("%d ",x1);
    printf("%d",x2);
    return 0;
}
cs

case 1:

x1 입력 값 : 10

x2 입력 값 : 10


out : 10, 10

case 2:

x1 입력 값 : 010

x2 입력 값 : 010


out : 10, 12

case 3:

x1 입력 값 : 0x10

x2 입력 값 : 0x10


out : 10, a

 

출력이 흥미롭다. 

입력시 %i와 %d는 다음과 같이 동작한다. 


%d: 내가 이제 변수를 하나 입력받을껀데 그건 32비트 10진수야!

%i : 내가 이제 변수를 하나 입력받을껀데 그건 integer type 이야!


여기서 약간 뉘앙스가 달라진다. 물론 결과도 달라지지만. 

%d는 입력변수가 10진수라는것을 가정하므로 8진수 접미나(0) 라던가 16진수 접미사(0x)를 무시한다.

즉 010는 그냥 10으로, 0x10역시 그냥 10으로 인식한다. 


하지만 %i는 다르다. 

입력변수의 진법을 모르기때문에 접미사를 확인하고 해당하는 진법에 맞게 입력을 받아드린다. 

따라서 010을 12(10진수로)로 0x10을 a로 출력할 수 있는 것이다.


보통 int형 변수를 입출력 시 사용하는 %d가 decimal을 의미하고 integer는 %i로 따로 나타낸 다는 것을 배웠다.

근데 어디에 써먹을 수 있을지는 모르겠다..


References

[1] https://stackoverflow.com/questions/17329647/i-or-d-to-print-integer-in-c-using-printf

[2] http://https ://www.acmicpc.net/problem/11816

[3] https://stackoverflow.com/questions/13409014/why-does-d-stand-for-integer

[4] https://www.le.ac.uk/users/rjm1/cotter/page_30.htm





Comments