인프런 커뮤니티 질문&답변
6.2 배열기초 2:09초 질문
작성
·
423
1
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요 교수님
교수님 강의를 보고 공부중인 학생입니다
using namespace std;
cout<<(int)&student_scores[2]<<endl;
이 코드를 x code에서 컴파일을 하니까,
Cast from pointer to smaller type 'int' loses information
이런 식으로 나오면서 컴파일 에러가 발생합니다.
이건 왜 이럴까요
그리고 번외적인 질문인데,왜 포인터의 주소값을 (int)로 캐스팅하면 이게 10진수로 바뀌나요? int라는 건 정수형을 나타내고, 이는 소수점을 표시하지 않는 거라고 생각하고, 진수 표현과는 관계가 없다는 생각이 들었습니다. 어떤 원리로 10진수로 바뀌는지 잘 모르겠습니다.
감사합니다.
답변 1
1
안녕하세요, 답변 도우미 Soobak 입니다.
Cast from pointer to smaller type 'int' loses information문제
: 포인터의 크기는 시스템에 따라서 다르지만, 일반적으로, 그리고 질문자님께서 학습하시는 환경을 고려했을 때64비트 시스템에서는8바이트의 크기를 가집니다. 반면에,int자료형은 일반적으로4바이트 입니다.
따라서,8바이트 크기인 포인터를4바이트 크기의int로 변환하려고 하면, 정보의 손실 위험성이 있기 때문에 컴파일러에서 해당 에러를 출력하는 것입니다.
이러한 문제를 해결하기 위해 다양한 환경에서 포인터의 크기 호환성을 고려한 자료형인uintptr_t와 같은 자료형을 사용하시면 올바르게 주소값을 변환하실 수 있습니다.
(6.9 포인터 연산과 배열 인덱싱 의 1:24 부분에서 교수님께서도 포인터 자료형의 주소를 출력하기 위해(int)으로 형 변환을 진행하는 것보다(uintptr_t)로 형 변환을 진행하는 것이 더 좋은 방법이라고 소개해주시므로, 미리 한 번 해당 부분만 잠시 둘러보시는 것도 추천드립니다.)
또한, 비슷한 내용의 다른 질문 글 링크도 첨부드립니다.
질문 - 메모리 주소 10진수로 출력(링크)포인터의 주소값을 (int)로 형변환하면 10진수로 바뀌는 이유
: 좀 더 정확히는 포인터의 주소값을(int)로 형변환하면, 그 값이 10진수로 "바뀌는" 것이 아닙니다. 단순히 사람이 더 쉽게 이해할 수 있도록 정수형 자료형인int로 자료형을 변환하여 10진수나 16진수 숫자로 출력하여 다루는 것입니다. ( C++ 에서cout은 기본적으로 숫자를 10진수로 출력하는 것과 관련이 있으며, 출력 형식을 변경하여 다른 진법의 숫자로 출력할 수도 있습니다. )
안녕하세요, 답변 도우미 Soobak 입니다.
C++ 의 cout 이 기본적으로 숫자 값을 10진수로 출력하기 때문입니다.
만약, cout << std::hex << (int)&student_scores[2]; 와 같이 출력해보시면 16진수로 출력되는 주소값을 확인하실 수 있습니다.
메모리 주소도 사실은 숫자 값이기 때문에 2진수, 10진수, 16진수 등 다양한 진법으로 표현이 가능합니다. 다만, 이를 어떤 진법으로 표현할지는 출력 함수, 표현 방법 등에 따라서 달라지게 되는 것입니다.
답변 감사합니다.
int main(void)
{
const int num_students = 20;
int students_scores[num_students];
cout << &students_scores[0] << endl; //1번
cout << (int) & students_scores[0] << endl; //2번
return 0;
}
위의 코드가 있으면 1번에서는 16진수로 나오고 2번에서 10진수로 나오는데
cout은 'int형' 기준 10진수가 기본값이 된다고 이해하면 될까요?
안녕하세요, 답변 도우미 Soobak 입니다.
네, 그렇습니다. 👍
cout 은 자료형에 따라서 기본 출력 형식이 달라지는데, 정수형 (int, long, 등) 은 기본적으로 10진수로, 포인터는 기본적으로 16진수로 출력됩니다.






친절한 답변 감사합니다
2번째 질문의 답변이 잘 이해가 안돼요 ㅠㅠ
왜 16진수였던 주소를 (int)로 캐스팅하면 10진수로 출력이 될까요?
이 부분이 전혀 모르겠어요