itsource

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

mycopycode 2022. 8. 29. 22:21
반응형

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

  • 부호 있는 char 형식의 객체에 대한 최소값
    SCHAR_MIN-127

  • 부호 있는 char 형식의 객체에 대한 최대값
    SCHAR_MAX +127

  • 부호 없는 char 형식의 객체에 대한 최대값
    UCHAR_MAX 255

....

즉, 1글자의 비트 수는 8개 이상이어야 합니다.

C99 표준 초안에서는 바이트의 폭은 적어도8비트여야 한다고 되어 있습니다.<limits.h>매크로 포함CHAR_BIT이는 바이트당 비트 수를 산출하며 최소 8(제5.2.4.2.1항)이 보장됩니다.

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

아니요, 8비트임을 보증하는 것은 아닙니다.size of(char)는 1로 보증되지만 반드시 1개의 8비트바이트를 의미하는 것은 아닙니다.

아니요. char 데이터 유형은 8비트 이상을 포함해야 합니다(ANSI 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_B와 같아야 합니다.IT - 1


각 서명된 정수 유형에는 동일한 양의 스토리지(부호 정보 포함)를 사용하고 동일한 정렬 요건을 가진 대응하는 부호 없는 정수 유형(부호 없음 키워드로 지정)이 있습니다.


부호 없는 문자 이외의 부호 없는 정수 타입의 경우 객체 표현의 비트는 값 비트와 패딩 비트(후자는 필요 없음)의 2개의 그룹으로 나뉩니다.

다음 구절을 통해 알 수 있습니다.

  • 부호 없는 문자는 2^CHAR_B를 나타내야 합니다.최소 CHAR_B로 부호화할 수 있는 IT-1 값IT 비트(표준으로 규정된 기존 비트 표현에 따름)
  • 부호 없는 문자는 추가(부호) 비트를 포함하지 않는다.
  • 부호 있는 문자는 부호 없는 문자와 정확히 같은 공간을 차지한다
  • char는 부호 있는 char 또는 부호 없는 char와 같은 방법으로 구현된다

결론 : 문자 및 그 바리안트 부호 없는 문자 및 부호 있는 문자 사이즈는 정확히 1바이트이며 바이트 폭은 최소 8비트입니다.

이제 이러한 것들은 문자 하나가 실제로 1바이트라는 것을 나타내는 다른 표시입니다(단, 위와 같은 공식적인 증거는 아닙니다).

비트 필드 이외의 오브젝트는 1개 또는 여러 바이트의 연속된 시퀀스로 구성됩니다.수, 순서 및 부호화는 명시적으로 지정되거나 구현 정의됩니다.


다른 객체 유형의 비트 이외의 객체에 저장된 값은 n × CHAR_B로 구성됩니다.IT 비트. 여기서 n은 해당 유형의 오브젝트 크기(바이트 단위)입니다.이 값은 부호 없는 문자 유형 [n]의 객체에 복사할 수 있습니다.


sizeof 연산자는 피연산자의 크기(바이트 단위)를 산출합니다.이 값은 식 또는 괄호로 둘러싸인 형식의 이름입니다.크기는 오퍼랜드의 유형에 따라 결정됩니다.결과는 정수입니다.피연산자의 유형이 가변 길이 배열 유형인 경우 피연산자가 평가되고 그렇지 않은 경우 피연산자는 평가되지 않으며 결과는 정수 정수입니다.


char, unsigned char 또는 signed char 또는 signed char(또는 그 수식 버전)를 가진 오퍼랜드에 적용하면 결과는 1이 됩니다.어레이 타입을 가진 오퍼랜드에 적용하면 어레이 내의 총 바이트 수가 됩니다.88) 구조체 또는 유니언 타입을 가진 오퍼랜드에 적용하면 내부 패딩과 후행 패딩을 포함한 이러한 오브젝트 내의 총 바이트 수가 됩니다.

(여기에는 애매한 점이 있습니다.여기서 size of(char)는 size of(type) 규칙보다 우선합니까?아니면 예시만 제공합니까?

여전히 해결해야 할 문제가 남아 있다.바이트란 정확히 무엇입니까?표준에 따르면 "비트 필드가 아닌 최소 객체"입니다.이것은 이론적으로 머신 바이트에 대응하지 않을 수도 있고, 또한 "머신 바이트"라고 불리는 것에 대해서도 모호함이 있다는 것에 주의하세요: 그것은 각 컨스트럭터가 "바이트"에 대해 다른 정의를 가질 수 있다는 것을 알고 "컴퓨터가 처리하는 일련의 비트"와 같은 일반적인 정의를 가질 수 있습니다.개별 단위로" 또는 "주소 지정 가능한 최소 데이터 청크"입니다.

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

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

limits.h를 기술하는 C 표준(일부 재포맷 필요):

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

CHAR_BIT 최소 8은 문자의 폭을 최소 8비트 이상으로 합니다.SCHAR_MIN 및 SCHAR_MAX의 범위는 부호 있는 문자를 나타내는 데 적어도8비트가 사용됩니다.

먼저 정확한 비트 수가 필요한 경우 크기별 유형을 사용하십시오.사용하시는 플랫폼에 따라서는__s8Linux에서 서명된8비트 타입의 경우__int8VC++로 설정할 수 있습니다.

Robert Love는 "Linux Kernel Development"의 휴대성에 관한 장에서 C 표준은 "최소한의 크기를 지시하지만 표준 타입의 크기를 구현에 맡긴다"고 언급하고 있습니다.

그리고 페이지 하단의 각주에 이렇게 적혀있다.char항상 8비트입니다.

그가 무엇에 근거하고 있는지는 모르겠지만, 아마도 ANSI C 사양의 이 섹션이 아닐까?

2.2.4.2 수치 한계

적합 구현은 헤더 limits.h 및 float.h에 명시되어야 하는 본 섹션에 명시된 모든 한계를 문서화해야 한다.

"적분형 제한 크기입니다.h"

아래 값은 #if 전처리 지침에서 사용하기에 적합한 상수 표현으로 대체해야 합니다.구현 정의 값은 같은 부호로 표시된 값과 크기(절대값) 이상이어야 합니다.

비트 필드가 아닌 최소 객체의 최대 비트 수(바이트)

CHAR_BIT 8

부호 있는 char 형식의 객체에 대한 최소값

SCHAR_MIN-127

부호 있는 char 형식의 객체에 대한 최대값

SCHAR_MAX +127

부호 없는 char 형식의 객체에 대한 최대값

UCHAR_MAX 255

char 형식의 객체에 대한 최소값

CHAR_MIN 아래 참조

char 형식의 객체에 대한 최대값

CHAR_MAX 아래 참조

지원되는 로케일의 경우 멀티바이트 문자 최대 바이트 수

MB_LEN_MAX 1

short int 유형의 객체에 대한 최소값

SHRT_MIN - 32767

short int 유형의 개체에 대한 최대값

SHRT_MAX +32767

부호 없는 short int 형식의 객체에 대한 최대값

USHRT_MAX 65535

유형 int 객체의 최소값

INT_MIN - 32767

유형 int 객체의 최대값

INT_MAX +32767

부호 없는 int 형식의 객체에 대한 최대값

UINT_MAX 65535

long int 유형의 객체에 대한 최소값

LONG_MIN -2147483647

long int 유형의 객체에 대한 최대값

LONG_MAX +2147483647

부호 없는 long int 형식의 객체에 대한 최대값

ULONG_MAX 4294967295

char_MIN 형식의 객체의 값이 식에서 사용될 때 확장되는 경우 CHAR_MIN의 값은 SCHAR_MIN의 값과 같아야 하며 CHAR_MAX의 값은 SCHAR_MAX의 값과 같아야 한다.char 형식의 객체의 값이 식에서 사용될 때 확장되지 않을 경우 CHAR_MIN의 값은 식에서 확장되어야 한다._MAX는 UCHAR_MAX의 ./7/와 같아야 한다.

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

반응형