-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
미해결
6.2 배열기초 2:09초 질문
23.09.02 17:56 작성 조회수 253
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
Soobak
2023.09.03
안녕하세요, 답변 도우미 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진수로 출력하는 것과 관련이 있으며, 출력 형식을 변경하여 다른 진법의 숫자로 출력할 수도 있습니다. )
김성관
질문자2023.09.03
친절한 답변 감사합니다
2번째 질문의 답변이 잘 이해가 안돼요 ㅠㅠ
왜 16진수였던 주소를 (int)로 캐스팅하면 10진수로 출력이 될까요?
이 부분이 전혀 모르겠어요
Soobak
2023.09.03
안녕하세요, 답변 도우미 Soobak 입니다.
C++ 의 cout
이 기본적으로 숫자 값을 10진수로 출력하기 때문입니다.
만약, cout << std::hex << (int)&student_scores[2];
와 같이 출력해보시면 16진수로 출력되는 주소값을 확인하실 수 있습니다.
메모리 주소도 사실은 숫자 값이기 때문에 2진수, 10진수, 16진수 등 다양한 진법으로 표현이 가능합니다. 다만, 이를 어떤 진법으로 표현할지는 출력 함수, 표현 방법 등에 따라서 달라지게 되는 것입니다.
김성관
질문자2023.09.03
답변 감사합니다.
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
2023.09.03
안녕하세요, 답변 도우미 Soobak 입니다.
네, 그렇습니다. 👍
cout
은 자료형에 따라서 기본 출력 형식이 달라지는데, 정수형 (int
, long
, 등) 은 기본적으로 10진수로, 포인터는 기본적으로 16진수로 출력됩니다.
답변 1