본문 바로가기
배운 것들 메모/따라 배우는 C언어

[홍정모의 따라하며 배우는 C언어] 4.7 printf() 함수의 변환 지정자들 메모

by 야속한 낭만 2024. 8. 19.

이번에는 제가 필요한 메모만 적어놨습니다.

 

 

%i와 %d의 차이점

형식 지정자에서 %i와 %d가 너무 궁금했음.

 

둘 모두 정수를 출력하는 데 사용될 수 있다.

하지만 입력(input)에 경우는 차이가 발생한다. ex) scanf

%i는 입력된 값이 8진수나 16진수인 경우, 각각 ‘0’ ‘0x’ 접두어에 따라서도 읽을 수 있다. 

 

 

#include <stdio.h>
#include <limits.h>
int main()
{
printf("%d %i %i %i\n", 1004, 1234, INT_MAX, UINT_MAX);

return 0;
}

 

출력하면, 하나는 최댓값, 하나는 2147483647, 그리고 -1이 출력된다.

 

%i와 %d 는 양수와 음수를 모두 포함하는 signed integer 이다.

그러나 UINT_MAX는 unsigned integer이며, 양수만 포함한다. 이 곳에서 사용할 수 있는 최대 값을 나타낸다.

%i와 UINT_MAX 표현할 수 있는 수

 

즉, 범위가 UINT_MAX > %i 인 것이다.

 

 

어째서 -1이 되었는가?

‘UINT_MAX’는 32비트, 부호 없는 정수이고, 그 곳에서 표현 할 수 있는 최대값을 뜻한다.

따라서 모든 비트가 0이 아닌 1로 되어있다.

 

1111 1111 1111 1111 1111 1111 1111 1111

 

이것이 %i(signed integer)에 넣었을 때 어떻게 해석이 되는 지 구해보면

 

1. 먼저 모든 비트를 1은 0으로 0은 1로, 반전시켜준다.

 

0000 0000 0000 0000 0000 0000 0000 0000

 

2. 그리고 1을 더해준다.

 

0000 0000 0000 0000 0000 0000 0000 0000

+)                                                                   1

——————————————————— ————

0000 0000 0000 0000 0000 0000 0000 0001

 

이것은 2^0 이므로 1을 의미 한다. 

 

1의 보수는 원래의 숫자의 ‘절대값’을 의미한다. (비트를 반전시키기 때문)

 

 

1111 1111 1111 1111 1111 1111 1111 1111

 

  ‘-1’ 이라는 것을 알 수 있다.

 

보수에 대해서 읽으면 좋은 글

 

출처:  홍정모의 따라배우는 C언어

강의 외의 추가된 것들은 책 그리고 인터넷 조사해서 얻었음