C / C ++에서 문자 크기 ( 'a')


298

C와 C ++에서 문자의 크기는 얼마입니까? 내가 아는 한 char의 크기는 C와 C ++에서 1 바이트입니다.

C에서 :

#include <stdio.h>
int main()
{
    printf("Size of char : %d\n", sizeof(char));
    return 0;
}

C ++에서 :

#include <iostream>
int main()
{
    std::cout << "Size of char : " << sizeof(char) << "\n";
    return 0;
}

놀랍지 않게, 둘 다 출력을 제공합니다. Size of char : 1

이제 우리는 같은 문자가 표시되는 것을 알고 'a', 'b', 'c', '|'난 그냥 다음에 위의 코드를 수정 ... 그래서 :

C에서 :

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

산출:

Size of char : 1
Size of char : 4

C ++에서 :

#include <iostream>
int main()
{
    char a = 'a';
    std::cout << "Size of char : " << sizeof(a) << "\n";
    std::cout << "Size of char : " << sizeof('a') << "\n";
    return 0;
}

산출:

Size of char : 1
Size of char : 1

sizeof('a')C와 C ++에서 다른 값을 반환합니까?


8
"%|"형식은 필요 int인수 (또는를 촉진 무언가를 int). sizeof유형의 결과를 산출합니다 size_t. int캐스트 를 사용하여 변환 하거나 구현에서 지원하는 경우을 사용하십시오 "%zu".
Keith Thompson

답변:


348

C에서 문자의 형 상수 등이 'a'실제로하다 int(4)의 크기 (또는 다른 구현에 의존 값)와 함께,. C ++에서 유형은 char1이며 크기는 1입니다. 이는 두 언어 간의 많은 작은 차이점 중 하나입니다.


12
C ++ Standard에서는 C 6.4.4.4의 섹션 2.13.2 / 1, 적어도 내가 가지고있는 문서에 있습니다.

14
+1 (단, "4의 크기"는 nthrgeek의 플랫폼에 적용되지만 모든 플랫폼에 반드시 적용되는 것은 아님)
sbi

28
@nthrgeek : 두 표준을 모두 인용하기에는 너무 게으르지 만 C ++ 표준에는 C와의 비 호환성에 대한 부록이 있습니다. 부록 C.1.1에서는 "문자 리터럴 유형이에서 (으) int로 변경되어 char동작을 설명합니다. :)
jalf

3
@nthrgeek : §6.4.4.4, 단락 10 : "정수 문자 상수는 int 유형입니다. 단일 바이트 실행 문자에 맵핑되는 단일 문자를 포함하는 정수 문자 상수의 값은 맵핑 된 표현의 숫자 값입니다. "정수로 해석되는 문자입니다."
Stephen Canon

7
@ nthrgeek : 특정 요점에 대해 논쟁이없고 상대방이 왜 다른 의견을 가지고 있는지 이해하고 싶지 않으면 표준 참조를 요구해서는 안됩니다. 모든 사람이 동의하면 그냥 수락하십시오. 당신은 (개발자로서) 혼자서 이와 같은 일반적인 대답을 빨리 찾을 수있을 정도로 똑똑해야합니다.
Martin York

26

Paul이 말했듯 이 C에는 있지만 C ++ 에는 있기 때문 'a'입니다 .intchar

몇 년 전에 다음과 같이 작성한 내용에서 C와 C ++의 차이점을 다룹니다. http://david.tribble.com/text/cdiffs.htm


4
궁금한 점이 있지만 C ++ 11 및 C11의 새로운 변경 사항을 포함하도록 해당 문서를 업데이트하고 있습니까?
Adam Rosenfield

지금은 아닙니다. C와 C ++에 대한 나의 관심은 지난 5 년 동안 크게 줄어 들었습니다.
David R Tribble

3
글쎄, 나는 당신의 작업을 사용하여 이것을 작성 했고 여기에 당신이 있습니다. 그런 작은 세상!

17

C에서 문자 리터럴의 유형은 C ++에서 intchar 입니다. 이것은 함수 오버로딩지원하는 데 필요한 C ++ 입니다. 이 예를보십시오 :

void foo(char c)
{
    puts("char");
}
void foo(int i)
{
    puts("int");
}
int main()
{
    foo('i');
    return 0;
}

산출:

char

5

C 언어 에서 문자 리터럴은 char유형 이 아닙니다 . C는 문자 리터럴을 정수로 간주합니다. 따라서 sizeof('a')와 사이에는 차이가 없습니다 sizeof(1).

따라서 문자 리터럴의 크기는 C의 정수와 같습니다.

C ++ 언어 에서 문자 리터럴은 유형입니다 char. cppreference의 말의 :

1) 좁은 문자 리터럴 또는 일반 문자 리터럴 (예 : 'a'또는 '\n'또는) '\13'. 이러한 리터럴은 유형char 과 실행 문자 세트의 c-char 표현과 동일한 값을 갖습니다. c-char가 실행 문자 세트에서 단일 바이트로 표현할 수없는 경우 리터럴에는 int 유형과 구현 정의 값이 있습니다.

따라서 C ++에서 문자 리터럴은의 유형입니다 char. 따라서 C ++에서 문자 리터럴의 크기는 1 바이트입니다.

Alos, 프로그램에서 sizeof연산자에 잘못된 형식 지정자를 사용했습니다 .

C11 §7.21.6.1 (P9) :

변환 스펙이 유효하지 않은 경우 동작이 정의되지 않습니다.

따라서 %zu대신 형식 지정자를 사용해야 합니다 %d. 그렇지 않으면 C에서 정의되지 않은 동작입니다.


%zu많은 플랫폼에서 지원되는 것이 아니라 더 나은 휴대 성, 사용 (int)sizeof(char)및 형식%d
chqrlie

문자 리터럴의 값이 반드시 해당 ASCII 코드 인 것은 아닙니다. 소스 및 실행 문자 세트와 char기본적으로 유형의 서명 여부에 따라 다릅니다 .
chqrlie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.