비전늅
[C언어] 형식지정자 float은 %f인데 integer는왜 %d일까 본문
%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
'Computer Languages > C language' 카테고리의 다른 글
FilePath을 string에 저장하기(Slash(/)와 BackSlash(\)의 차이는?) (0) | 2018.02.15 |
---|