매우 간단한 c 질문 (%d)

wone28의 이미지

#include <stdio.h>
 
int main(){
	char a = 'a';
 
	printf("%c %d\n", a, a);
 
 
	return 0;
}

위 코드에서 %d 는 메모리에서 4바이트 만큼 읽어서 정수값을 출력하는데, (32비트)

왜 아스키코드값 65만 정확히 나오는지 궁금합니다.

답변 해주시면 감사하겠습니다.

세벌의 이미지

저는 a 97 나옵니다.

익명 사용자의 이미지

저도 97이요

라스코니의 이미지

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이 찍히죠.

bushi의 이미지

a 라는 변수의 주소가 printf 에 전달되는 것이 아니고,
a 라는 변수에 담긴 값이 다른 곳에 복사된 다음에 그 복사된 곳을 printf() 가 접근합니다.
architecture(의 제작자) 마다 컴파일러(의 제작자/제작사)마다 함수 호출 규약이 다르긴하지만, 남는 범용 CPU 레지스터를 이용하거나 주어진 stack 메모리를 사용하거나 정도의 차이일 뿐입니다.

raymundo의 이미지

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비트 시스템에서는 무조건 메모리에 가변 인자를 한 덩어리로 두는 게 아니라 타입에 따라 적절한 레지스터에 담아 전달하는 걸로 압니다. 이런 구체적인 전달 방법은 구현체의 영역인 걸로...)

좋은 하루 되세요!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.