포인터 자료형과 크기 그리고 포인터 형변환에 대해 질문드리겠습니다

wans038의 이미지

가입하자마자 죄송하게 질문을 드립니다(__)
질문이 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로 형변환해서 손실이 이러나고 형변환 이유도 알고 있습니다.

그런데
포인터 형변환은 이해가 가지 않습니다. 왜 형변환이 이루어지는지? 제가 첫번째 질문에서 말한 그래고 인가요?(메모리 참조 기준을 두기떄문에 인가요?)
첫번째 궁금증이 풀리면 두번쨰 질문은 왜 그런지 알것 같습니다.

맞춤법이 많이 틀린 긴 글 읽어주셔서 감사인사 드립니다(꾸벅)

HDNua의 이미지

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 환경이라고 하겠습니다.

char c = 'A'; // c의 주소 값을 기준으로 [ 65 | ?? | ?? | ?? ]과 같이 메모리에 저장됩니다. (65는 문자 'A'에 대한 ASCII 코드 값)
char *pc;
int *pi;
int result;
 
pc = &c; // char 형식의 주소 값을 획득합니다.
pi = pc; // 서로 다른 자료형의 포인터를 대입합니다.
 
result = *pi; // pi의 시작 주소는 &c와 같으므로, *pi는 [ 65 | ?? | ?? | ?? ]과 같이 쓰레기 값을 포함하게 됩니다.
printf("%d \n", result); // 쓰레기 값이 출력됩니다.

이럴 때 컴파일러는 (pi = pc) 구문에서 두 형식이 달라 쓰레기 값이 나올 수 있음을 경고하는데,
특별한 경우에는 이런 식으로 원래 크기와 다른 크기의 값을 읽어야 하는 경우가 있습니다. 그럴 때 사용하시면 됩니다.

사실 이건 printf도 얽혀있는 재미있는 질문이라 설명하고 싶은 것이 많은데,
이것까지 설명하면 혼란만 더해질 것 같아서 일단 그만둡니다.

저는 이렇게 생각했습니다.

jick의 이미지

64비트 운영체제에서도 거의 모든 경우 int는 여전히 32비트입니다만...

포인터만 8바이트입니다.

HDNua의 이미지

16bit 시절에는 int의 크기가 2byte였다는 얘기를 듣고 64bit도 그러려니 하고 넘겨짚었던 모양입니다.
알려주셔서 감사합니다.

궁금한 것이 있는데, int라는 자료형의 크기는 정확히 어떤 것이 기준인지 혹시 알고 계신가요?
저는 지금까지 그게 레지스터의 크기라고 알고 있었습니다.

저는 이렇게 생각했습니다.

익명 사용자의 이미지

64비트 정수형 모델에는 여러가지가 있습니다.

LP64 (also known as 4/8/8)
ILP64 (also known as 8/8/8)
LLP64 (also known as 4/4/8)

함부로 단정지어 말할 수 있는 문제가 아닙니다.

wans038의 이미지

도움 많이 되었습니다! 감사합니다!
입문서에는 안나오는 이런내용은 어떻게 공부하셨는지 궁금합니다!
학생입니다.

HDNua의 이미지

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바이트만 읽는 것과 같이 생각하시면 됩니다.

피드백 환영합니다.

저는 이렇게 생각했습니다.

mydream의 이미지

제 컴은 32비트 컴퓨터라 int하면 무조건 4바이트씩 자료형을 해석합니다. 64비트 컴퓨터에는 int64라는 자료형이 더 있지 않나요. 한 번 검색해보세요. int는 그냥 32비트 자료형일 겁니다. 그리고 포인터가 가리키는 대상체는 그 자료형단위로 잘려서 자료가 읽히겠죠. 그리고 char형 변수에 정수 값을 읽히면 오버플로우되는 부분은 잘려버립니다.

익명 사용자의 이미지

위에서 말한대로 데이터형의 크기는 함부로 단정지을 수 없습니다.
64비트 정수형 모델은 매우 다양합니다.

그리고 signed 데이터형으로의 변환은 그 표현범위를 벗어난 경우에는 implementation-defined manner입니다.
기대하는 동작을 하려면 unsigned char형 변수에 읽혀야죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.