Love Every Moment

〔C언어〕궁금증: 왜 '10' 을 int 로 출력하면 12592 가 될까? 본문

PROGRAMMING::LANGUAGE/C

〔C언어〕궁금증: 왜 '10' 을 int 로 출력하면 12592 가 될까?

해 송 2021. 12. 16. 12:39
반응형

동료 카뎃이랑 코드를 가지고 이것저것 실험해보다가 요상한 것을 발견했다.

printf("%d", 10) 대신에 printf("%d", '10') 을 입력하니 결과가 10이 아닌 12592 가 나오는 것이었다.



 

위의 세 코드는 똑같은 결과(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 가 된다.

 

반응형
Comments