Love Every Moment
〔C언어〕궁금증: 왜 '10' 을 int 로 출력하면 12592 가 될까? 본문
동료 카뎃이랑 코드를 가지고 이것저것 실험해보다가 요상한 것을 발견했다.
printf("%d", 10) 대신에 printf("%d", '10') 을 입력하니 결과가 10이 아닌 12592 가 나오는 것이었다.
구글링도 하고 스택 오버플로우도 뒤지면서 도출한 결론은 이렇다.
따옴표 ' ' 안에 들어간 10 의 타입은 char 형식으로 인식된다.
1 과 0 은 ascii 코드로 각각 49 와 48 이다.
char 의 크기는 1바이트(8비트)이고 int 의 크기는 4바이트(32비트)이다.
따라서 (int)'10' 은 (49 * 8 * 32) + 48 = 12592 가 된다.
물론 애초에 char 형식의 ' ' 안에 한 자리 문자를 넣지 않은 것부터 이상하기 때문에 컴파일을 하면 다음과 같은 경고가 뜬다.
multi-character 가 아닌 '1' 을 넣으면 1의 아스키 코드인 49가 경고 메시지 없이 정상 출력된다.
그리고 아직 해결되지 못한 궁금증...(12.22 해결 완료!)
왜 printf("%i", "1") 을 하면 26341301 이라는 값이 나오는지 아직 모르겠다.
" " 은 char * 이고 포인터의 크기는 8바이트(64비트), int 의 크기는 4바이트(32비트) 이니까
1의 아스키 코드 49 * 64 * 32 이렇게 되는건가 했는데 아니다.
나중에 해결되면 추가하러 와야지
12.22 추가
" " 은 char *, 즉 포인터 이므로 내용물인 1이 아니라 1의 메모리 주소를 값으로 가진다.
따라서 printf("%p\n", "1"); 해보면 1의 메모리 주소가 나온다. (0x10a918fae)
이제 0x10a918fae 를 int 로 형변환하는 과정을 보자.
포인터의 크기는 8바이트(64비트)이지만 int 의 크기는 4바이트(32비트)이므로 앞의 4 바이트는 전부 0으로 바뀐다.
즉, 000000010a918fae 에서 앞의 32비트만큼이 날아간 0a918fae 가 된다.
따라서 0x10a918fae 였던 값이 0x0a918fae 가 되고, 지금의 16진수를 10진수로 변환해주면 177311662 가 된다.
'PROGRAMMING::LANGUAGE > C' 카테고리의 다른 글
〔C언어〕코드 실행 결과를 시각화하는 사이트 추천 (0) | 2022.01.03 |
---|---|
〔C언어〕서식지정자(Format Specifier)란? (0) | 2021.06.12 |
〔C언어〕메모리 누수 검사하기 (0) | 2021.06.04 |
〔C언어〕댕글링 포인터(Dangling Pointer)란? (0) | 2021.05.27 |
〔C언어〕정적 변수(Static Variable)란? (0) | 2021.05.19 |