포인터 자료형과 크기 그리고 포인터 형변환에 대해 질문드리겠습니다
가입하자마자 죄송하게 질문을 드립니다(__)
질문이 2개정도 됩니다.
일단
포인터 자료형과 크기에 대해 궁금증이 생겨서 질문을 드립니다.
저의집 컴이 64비트입니다.
그래서 포인터 크기도 64비트로 처리해서 sizeof(포인터)을 하면 8이 나옵니다
그런데!
포인터 자료형은 포인터를 대상으로 *연산을 하기위해 즉 메모리 참조의 기준을 두기위해 포인터 자료형이 있는걸로 압니다.
즉
int* ptr = #
*ptr = 30;
printf("%d", ptr); // 이런 코드가 있다고 하면 ptr이 가지고 있는 첫번째 주소값을 기준으로 4바이트 정수로 해석 해서 읽어라!
여기까지가 포인터 자료형이 있는 이유로 알고 있는데
제 컴은 8바이트인데 주소값을 8바이트로 처리하는데 int형 포인터를 4바이트로 해석한다?? 무슨말이요!!!??
제컴은 8바이트인데 int형 포인터로 *연산을 할떄 4바이트 정수로 해석??
무슨말인가요? 주소값을 8바이트로 표현만하고 메모리 표현은 그대로 인가요?(이게 무슨말이지)
정말 궁금합니다...
여기까지 읽는것도 감사드린데...죄송하지만 하나더 질문드릴게요... 죄송합니다...
포인터 형변환이 궁금합니다.
int a = 10;
char b = a;이러면 int를 char로 형변환해서 손실이 이러나고 형변환 이유도 알고 있습니다.
그런데
포인터 형변환은 이해가 가지 않습니다. 왜 형변환이 이루어지는지? 제가 첫번째 질문에서 말한 그래고 인가요?(메모리 참조 기준을 두기떄문에 인가요?)
첫번째 궁금증이 풀리면 두번쨰 질문은 왜 그런지 알것 같습니다.
맞춤법이 많이 틀린 긴 글 읽어주셔서 감사인사 드립니다(꾸벅)
답변
C 프로그래밍 언어를 사용한다고 생각하고 답변하겠습니다.
1. int라는 자료형은 CPU가 읽을 수 있는 가장 적합한 크기를 표현할 때 사용합니다.
보통 내부의 레지스터 크기가 되는데, 레지스터가 16bit면 int는 2byte, 32bit면 4byte, 64bit면 8byte인 식입니다.
int 형식의 크기가 4byte인 경우는 32bit CPU에 대한 것입니다.
2. 아마 질문자 분께서 "int형은 4byte다"라고 책에 설명된 것을 보신 것 같은데,
이런 책들은 대개 독자가 32bit CPU의 컴퓨터를 실행하고 있다고 가정합니다.
보통 책 앞부분에서 설명하는데 프로그래밍 입문자는 알아들을 리가 없고 "int는 그냥 4바이트다" 하고 넘어가지요.
3. 결론만 말씀드리면, 첫 번째 질문의 말, "첫 번째 주소값을 기준으로 4바이트 정수로 해석해서 읽는다"는 말은
32bit 환경에서는 맞는 말이지만 64bit 환경에서는 맞을 수도 있고 틀릴 수도 있다는 것입니다.
4. 포인터끼리의 형 변환은 코드 오류를 줄이기 위한 것이라고 생각하시면 됩니다. 32bit 환경이라고 하겠습니다.
이럴 때 컴파일러는 (pi = pc) 구문에서 두 형식이 달라 쓰레기 값이 나올 수 있음을 경고하는데,
특별한 경우에는 이런 식으로 원래 크기와 다른 크기의 값을 읽어야 하는 경우가 있습니다. 그럴 때 사용하시면 됩니다.
사실 이건 printf도 얽혀있는 재미있는 질문이라 설명하고 싶은 것이 많은데,
이것까지 설명하면 혼란만 더해질 것 같아서 일단 그만둡니다.
저는 이렇게 생각했습니다.
...
64비트 운영체제에서도 거의 모든 경우 int는 여전히 32비트입니다만...
포인터만 8바이트입니다.
알려주셔서 감사합니다.
16bit 시절에는 int의 크기가 2byte였다는 얘기를 듣고 64bit도 그러려니 하고 넘겨짚었던 모양입니다.
알려주셔서 감사합니다.
궁금한 것이 있는데, int라는 자료형의 크기는 정확히 어떤 것이 기준인지 혹시 알고 계신가요?
저는 지금까지 그게 레지스터의 크기라고 알고 있었습니다.
저는 이렇게 생각했습니다.
64비트 정수형 모델에는 여러가지가
64비트 정수형 모델에는 여러가지가 있습니다.
LP64 (also known as 4/8/8)
ILP64 (also known as 8/8/8)
LLP64 (also known as 4/4/8)
함부로 단정지어 말할 수 있는 문제가 아닙니다.
감사합니다!
도움 많이 되었습니다! 감사합니다!
입문서에는 안나오는 이런내용은 어떻게 공부하셨는지 궁금합니다!
학생입니다.
답글
1. 프로그래밍 커뮤니티 돌아다니며 물어보고 틀리면서 배우고 있습니다.
상황 보니 지금도 잘못 알려드린 것 같네요. 죄송합니다.
2. jick님과 mydream님의 답글을 보고 int64에 대해 검색해서, Windows에서 sizeof(int)의 값에 대한 문서는 찾았습니다.
http://blog.naver.com/xenesis/20197019488
http://pak2536.tistory.com/29
아마 Windows 사용하고 계실테니 답변을 다시 하겠습니다.
int는 Windows 환경에서 32bit이고, 주소 값이 8바이트인데 4바이트를 읽는다는 건
32bit 환경에서 char 형식의 포인터 변수의 크기가 4바이트이지만 * 연산자로 접근할 때 1바이트만 읽는 것과 같이 생각하시면 됩니다.
피드백 환영합니다.
저는 이렇게 생각했습니다.
64비트 컴퓨터라면 int64 아니던가요?
제 컴은 32비트 컴퓨터라 int하면 무조건 4바이트씩 자료형을 해석합니다. 64비트 컴퓨터에는 int64라는 자료형이 더 있지 않나요. 한 번 검색해보세요. int는 그냥 32비트 자료형일 겁니다. 그리고 포인터가 가리키는 대상체는 그 자료형단위로 잘려서 자료가 읽히겠죠. 그리고 char형 변수에 정수 값을 읽히면 오버플로우되는 부분은 잘려버립니다.
위에서 말한대로 데이터형의 크기는 함부로 단정지을 수
위에서 말한대로 데이터형의 크기는 함부로 단정지을 수 없습니다.
64비트 정수형 모델은 매우 다양합니다.
그리고 signed 데이터형으로의 변환은 그 표현범위를 벗어난 경우에는 implementation-defined manner입니다.
기대하는 동작을 하려면 unsigned char형 변수에 읽혀야죠.
댓글 달기