a 라는 변수의 주소가 printf 에 전달되는 것이 아니고,
a 라는 변수에 담긴 값이 다른 곳에 복사된 다음에 그 복사된 곳을 printf() 가 접근합니다.
architecture(의 제작자) 마다 컴파일러(의 제작자/제작사)마다 함수 호출 규약이 다르긴하지만, 남는 범용 CPU 레지스터를 이용하거나 주어진 stack 메모리를 사용하거나 정도의 차이일 뿐입니다.
질문하신 분의 말은 char 타입(1바이트 크기)의 값을 넘겨주었고 printf는 %d포맷을 처리할 때 4바이트를 읽을텐데 어떻게 1바이트만 골라내어 읽느냐는 말 같습니다만.
("왜 ...인지 궁금하다"라는 질문을 할 거면 이왕이면 "내 생각에는 이러이러해서 다른 결과가 나올 것 같은데"를 잘 적어주셨다면 훨씬 좋았을 텐데요)
만일 질문의 뜻이 그게 맞다면, printf는 가변인자함수라서 두번째 인자부터는 프로토타입이 지정되지 않았고, 그래서 default argument promotion이 적용되어 int보다 작은 크기의 정수형은 int로, float은 double로 변환되어 전달됩니다.
즉 애초에 printf는 인자로 char * 하나와 int 두 개(각각 0x00000061 이겠죠)를 받은 거고, %c를 처리하기 위해서 가변인자 덩어리에서 4바이트를 읽고, %d를 처리하기 위해서 또 4바이트를 읽었을 겁니다. (이것도 인텔/AMD 64비트 시스템에서는 무조건 메모리에 가변 인자를 한 덩어리로 두는 게 아니라 타입에 따라 적절한 레지스터에 담아 전달하는 걸로 압니다. 이런 구체적인 전달 방법은 구현체의 영역인 걸로...)
저는 a 97 나옵니다.
저는 a 97 나옵니다.
세벌 https://sebuls.blogspot.kr/
저도 97이요
저도 97이요
char 는 문자형의 선언문이 아닙니다. 그보다는 1
char 는 문자형의 선언문이 아닙니다. 그보다는 1 byte를 보관할 수 있는 '정수형'이라고 보셔야 합니다.
char 를 문자형이라고 인식하면 지금처럼 혼동되는 상황이 일어날수도 있죠. C는 문자형 데이터 처리에 굉장히 불친절한 언어중에 하나입니다.
char a = 'a'는 'a' 라는 값을 1 byte 사이즈의 값을 보관할 수 (부호있는 또는 부호없는) 변수인 a에 대입하는 것입니다. 'a'는 아스키 값 테이블을 뒤져 보면 97이네요.
자 이제 a 는 97을 가지게 되었습니다.
이제 a를 printf() 함수를 이용해서 출력할 수 있게 되었네요. printf() 관련 문서를 읽어보면 다양한 포맷을 볼 수 있는데,
%c, %s 등은 문자/문자열 출력
%d, %u, %f, %lf, %e 등은 숫자 출력 등에 사용됩니다.
"%c", a 를 하게되면 컴파일러는 a 가 가진 값 즉 97을 문자로 찍으려고 할 것이고 그 결과로 'a'가 찍힙니다.
"%d", d 를 하게되면 컴파일러는 a 가 가진 값을 그냥 정수형으로 출력합니다. 그러면 그냥 97이 찍히죠.
a 라는 변수의 주소가 printf 에 전달되는 것이
a 라는 변수의 주소가 printf 에 전달되는 것이 아니고,
a 라는 변수에 담긴 값이 다른 곳에 복사된 다음에 그 복사된 곳을 printf() 가 접근합니다.
architecture(의 제작자) 마다 컴파일러(의 제작자/제작사)마다 함수 호출 규약이 다르긴하지만, 남는 범용 CPU 레지스터를 이용하거나 주어진 stack 메모리를 사용하거나 정도의 차이일 뿐입니다.
65냐 97이냐야 'A'와 'a'를 혼동해서 잘못
65냐 97이냐야 'A'와 'a'를 혼동해서 잘못 쓰신 걸테고,
질문하신 분의 말은 char 타입(1바이트 크기)의 값을 넘겨주었고 printf는 %d포맷을 처리할 때 4바이트를 읽을텐데 어떻게 1바이트만 골라내어 읽느냐는 말 같습니다만.
("왜 ...인지 궁금하다"라는 질문을 할 거면 이왕이면 "내 생각에는 이러이러해서 다른 결과가 나올 것 같은데"를 잘 적어주셨다면 훨씬 좋았을 텐데요)
만일 질문의 뜻이 그게 맞다면, printf는 가변인자함수라서 두번째 인자부터는 프로토타입이 지정되지 않았고, 그래서 default argument promotion이 적용되어 int보다 작은 크기의 정수형은 int로, float은 double로 변환되어 전달됩니다.
즉 애초에 printf는 인자로 char * 하나와 int 두 개(각각 0x00000061 이겠죠)를 받은 거고, %c를 처리하기 위해서 가변인자 덩어리에서 4바이트를 읽고, %d를 처리하기 위해서 또 4바이트를 읽었을 겁니다. (이것도 인텔/AMD 64비트 시스템에서는 무조건 메모리에 가변 인자를 한 덩어리로 두는 게 아니라 타입에 따라 적절한 레지스터에 담아 전달하는 걸로 압니다. 이런 구체적인 전달 방법은 구현체의 영역인 걸로...)
좋은 하루 되세요!
댓글 달기