이번에는 제가 필요한 메모만 적어놨습니다.
%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이며, 양수만 포함한다. 이 곳에서 사용할 수 있는 최대 값을 나타낸다.
즉, 범위가 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언어
강의 외의 추가된 것들은 책 그리고 인터넷 조사해서 얻었음
'배운 것들 메모 > 따라 배우는 C언어' 카테고리의 다른 글
4.10 강 들으면서 추가적으로 조사한 것 -2 (0) | 2024.08.25 |
---|---|
[홍정모의 따라하며 배우는 C언어] 4.10 scanf() 함수의 사용법 메모 - 1 (0) | 2024.08.20 |
[홍정모의 따라하며 배우는 C언어] 4.5 ~ 4.6 기호적 항수와 전처리기 메모 (0) | 2024.08.12 |
[홍정모의 따라하며 배우는 C언어] 4.4 strlen() 함수 메모 (0) | 2024.08.10 |
[홍정모의 따라하며 배우는 C언어] 4.3 문자열이 메모리에 저장되는 구조 (0) | 2024.08.08 |