• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

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

답변을 작성해보세요.

1

Soobak님의 프로필

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님의 프로필

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님의 프로필

Soobak

2023.09.03

안녕하세요, 답변 도우미 Soobak 입니다.

네, 그렇습니다. 👍

cout 은 자료형에 따라서 기본 출력 형식이 달라지는데, 정수형 (int, long, 등) 은 기본적으로 10진수로, 포인터는 기본적으로 16진수로 출력됩니다.