Programing

char의 길이는 정확히 8 비트입니까?

lottogame 2020. 12. 9. 07:41
반응형

char의 길이는 정확히 8 비트입니까?


이 질문에 이미 답변이 있습니다.

그게 다야. 비슷한 주제를 찾지 못 했으므로 저와 함께 참아주세요.


에서 는 ANSI C 규격의 사본 을 참조 섹션 3.1.2.5을 - 유형 :

char 형식으로 선언 된 개체는 기본 실행 문자 집합의 모든 구성원을 저장할 수있을만큼 큽니다. $ 2.2.1에 열거 된 필수 소스 문자 집합의 구성원이 char 개체에 저장되면 해당 값은 양수로 보장됩니다. 다른 수량이 char 객체에 저장되는 경우 동작은 구현에 따라 정의됩니다. 값은 부호가 있거나 음이 아닌 정수로 처리됩니다.

"실행 문자 집합"의 개념은 섹션 2.2.1-문자 집합 에서 소개됩니다 .

즉, 문자는 기본 실행 문자 집합을 구성하는 최소한 95 개의 서로 다른 문자의 인코딩을 포함 할 수있을만큼 충분히 커야합니다.

이제 섹션 2.2.4.2-수치 제한을 추가하십시오.

적합한 구현은이 섹션에 지정된 모든 제한을 문서화해야하며, 이는 헤더 <limits.h><float.h>.

적분 유형의 크기

아래에 주어진 값은 #if 전처리 지시문에서 사용하기에 적합한 상수 표현식으로 대체됩니다. 구현 정의 값은 동일한 부호를 사용하여 표시된 값과 크기 (절대 값)가 같거나 커야합니다.

  • 비트 필드가 아닌 가장 작은 개체의 최대 비트 수 (바이트)
    CHAR_BIT 8

  • 서명 된 문자 유형의 객체에 대한 최소값
    SCHAR_MIN -127

  • 서명 된 문자 유형의 객체에 대한 최대 값
    SCHAR_MAX +127

  • unsigned char
    UCHAR_MAX 255 유형의 오브젝트에 대한 최대 값

....

그래서 거기에 있습니다-문자의 비트 수 는 적어도 8 이어야합니다 .


아니요, 8 비트가 보장되지는 않습니다. sizeof (char)는 1로 보장되지만 반드시 8 비트 바이트를 의미하지는 않습니다.


아니요, char 데이터 유형은 최소 8 비트를 포함해야합니다 (ANSI C 사양 참조).


C99 표준 초안은 바이트 당 비트 수를 산출 <limits.h>하는 매크로 CHAR_BIT포함하고 최소 8 (§5.2.4.2.1)이 보장 되기 때문에 바이트는 최소 8 비트 너비 여야한다고 말합니다 .

C ++ 표준 초안에는 <limits.h>이름 <climits>(§18.2.2) 아래에 C가 포함되어 있습니다.


표준이 말하는 것을 정확히 봅시다 :

5.2.4.2.1 정수 유형의 크기
...
구현 정의 값은 동일한 부호를 사용하여 표시된 값과 크기 (절대 값)가 같거나 커야합니다.


비트 필드가 아닌 가장 작은 객체의 비트 수 (바이트)
CHAR_BIT 8

이것은 바이트가 최소 8 비트라는 것을 알려줍니다.

char 형 객체의 값을 표현식에서 사용할 때 부호있는 정수로 취급하면 CHAR_MIN의 값은 SCHAR_MIN의 값과 같고 CHAR_MAX의 값은 SCHAR_MAX의 값과 같아야합니다. 그렇지 않으면 CHAR_MIN의 값은 0이고 CHAR_MAX의 값은 UCHAR_MAX의 값과 동일합니다. UCHAR_MAX 값은 2 ^ CHAR_BIT-1과 같아야합니다.


각 부호있는 정수 유형에 대해 동일한 양의 스토리지 (부호 정보 포함)를 사용하고 동일한 정렬 요구 사항을 갖는 해당 (그러나 다른) 부호없는 정수 유형 (부호없는 키워드로 지정됨)이 있습니다.


부호없는 문자 이외의 부호없는 정수 유형의 경우, 객체 표현의 비트는 값 비트와 패딩 비트 (후자가있을 필요는 없음)의 두 그룹으로 나뉩니다.

이 구절은 다음과 같이 말합니다.

  • 부호없는 문자는 최소 CHAR_BIT 비트로 인코딩 할 수있는 2 ^ CHAR_BIT-1 값을 나타내야합니다 (표준에서 규정하는 기존 비트 표현에 따라).
  • 부호없는 문자에는 추가 (패딩) 비트가 포함되지 않습니다.
  • 부호있는 문자는 부호없는 문자와 정확히 같은 공간을 차지합니다.
  • char는 부호있는 또는 부호없는 문자와 동일한 방식으로 구현됩니다.

결론 : char 및 그 변형 unsigned char 및 signed char은 정확히 1 바이트 크기로 보장되며 바이트는 최소 8 비트 너비가 보장됩니다.

이제 그들은 char가 실제로 1 바이트라는 다른 표시입니다 (그러나 위의 공식적인 증거는 아닙니다).

비트 필드를 제외하고 객체는 하나 이상의 바이트로 구성된 연속적인 시퀀스로 구성되며 그 수, 순서 및 인코딩은 명시 적으로 지정되거나 구현에 의해 정의됩니다.


다른 객체 유형의 비트 필드가 아닌 객체에 저장된 값은 n × CHAR_BIT 비트로 구성됩니다. 여기서 n은 해당 유형의 객체 크기 (바이트)입니다. 값은 unsigned char [n] 유형의 객체로 복사 될 수 있습니다.


sizeof 연산자는 피연산자의 크기 (바이트 단위)를 산출하며, 표현식 또는 유형의 괄호로 묶인 이름 일 수 있습니다. 크기는 피연산자의 유형에 따라 결정됩니다. 결과는 정수입니다. 피연산자의 유형이 가변 길이 배열 유형이면 피연산자가 평가됩니다. 그렇지 않으면 피연산자가 평가되지 않고 결과는 정수 상수입니다.


유형이 char, unsigned char 또는 signed char 인 피연산자 (또는 그 규정 된 버전)에 적용될 때 결과는 1입니다. 배열 유형이있는 피연산자에 적용될 때 결과는 배열의 총 바이트 수입니다. . 88) 구조 또는 공용체 유형이있는 피연산자에 적용되는 경우 결과는 내부 및 후행 패딩을 포함하여 해당 오브젝트의 총 바이트 수입니다.

(여기에 모호함이 있습니다. 여기서 sizeof (char)가 sizeof (type) 규칙을 재정의합니까 아니면 단지 예제를 제공합니까?)

여전히 해결해야 할 문제가 있습니다. 바이트는 정확히 무엇입니까? 표준에 따르면 "비트 필드가 아닌 가장 작은 개체"입니다. 이것은 이론적으로 머신 바이트에 해당하지 않을 수 있으며 "머신 바이트"라고하는 것에 대한 모호함도 있습니다. 생성자가 "바이트"라고 부르는 것은 무엇이든 가능하며 각 생성자는 서로 다를 수 있음을 알고 있습니다. "바이트"의 정의; 또는 "컴퓨터가 개별 단위로 처리하는 비트 시퀀스"또는 "가장 작은 주소 지정 가능한 데이터 청크"와 같은 일반적인 정의입니다.

예를 들어, 7 비트 바이트를 가진 기계는 "C 바이트"를 2 개의 기계 바이트로 구현해야합니다.

모든 인용 출처 : 위원회 초안 — 2007 년 9 월 7 일 ISO / IEC 9899 : TC3 .


limits.h를 설명하는 C 표준에서 (일부 재 포맷 필요) :

  1. 비트 필드 (바이트)가 아닌 가장 작은 객체의 비트 수 : CHAR_BIT 8
  2. 부호있는 문자 유형의 오브젝트에 대한 최소값 : SCHAR_MIN -127
  3. 부호있는 문자 유형의 오브젝트에 대한 최대 값 : SCHAR_MAX +127

CHAR_BIT 최소 8은 문자가 최소 8 비트 너비가되도록합니다. SCHAR_MIN 및 SCHAR_MAX의 범위는 부호있는 문자의 표현이 최소 8 비트를 사용하도록합니다.


첫 번째로 말하고 싶은 것은 유형이 정확한 비트 수 여야하는 경우 크기별 유형을 사용한다는 것입니다. __s8Linux의 서명 된 8 비트 유형부터 __int8Windows의 VC ++ 까지의 범위가 될 수있는 플랫폼에 따라 다릅니다.

Now, according to Robert Love in his chapter on portability in "Linux Kernel Development" he states that the C standard "leaves the size of the standard types up to implementations, although it does dictate a minimum size."

Then in a footnote at the bottom of the page he says, "With the exception of char which is always 8 bits"

Now I'm not sure what he's basing this on, but maybe it's this section from the ANSI C spec?

2.2.4.2 Numerical limits

A conforming implementation shall document all the limits specified in this section, which shall be specified in the headers limits.h and float.h

"Sizes of integral types limits.h"

The values given below shall be replaced by constant expressions suitable for use in #if preprocessing directives. Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.

maximum number of bits for smallest object that is not a bit-field (byte)

CHAR_BIT 8

minimum value for an object of type signed char

SCHAR_MIN -127

maximum value for an object of type signed char

SCHAR_MAX +127

maximum value for an object of type unsigned char

UCHAR_MAX 255

minimum value for an object of type char

CHAR_MIN see below

maximum value for an object of type char

CHAR_MAX see below

maximum number of bytes in a multibyte character, for any supported locale

MB_LEN_MAX 1

minimum value for an object of type short int

SHRT_MIN -32767

maximum value for an object of type short int

SHRT_MAX +32767

maximum value for an object of type unsigned short int

USHRT_MAX 65535

minimum value for an object of type int

INT_MIN -32767

maximum value for an object of type int

INT_MAX +32767

maximum value for an object of type unsigned int

UINT_MAX 65535

minimum value for an object of type long int

LONG_MIN -2147483647

maximum value for an object of type long int

LONG_MAX +2147483647

maximum value for an object of type unsigned long int

ULONG_MAX 4294967295

If the value of an object of type char sign-extends when used in an expression, the value of CHAR_MIN shall be the same as that of SCHAR_MIN and the value of CHAR_MAX shall be the same as that of SCHAR_MAX . If the value of an object of type char does not sign-extend when used in an expression, the value of CHAR_MIN shall be 0 and the value of CHAR_MAX shall be the same as that of UCHAR_MAX ./7/

참고URL : https://stackoverflow.com/questions/881894/is-char-guaranteed-to-be-exactly-8-bit-long

반응형