sizeof (char)! = 1 또는 최소한 CHAR_BIT> 8 인 기계가 있습니까?


93

기계 (또는 컴파일러)가 sizeof(char) != 1있습니까?

합니까 C99 표준은 말한다 sizeof(char)표준 준수 구현에 정확히 1을해야합니까? 그렇다면 섹션 번호와 인용문을 알려주십시오.

업데이트 : 바이트를 처리 할 수없는 (최소 읽기 4 바이트, 정렬 됨) 시스템 (CPU)이 있지만 4 바이트 ( uint32_t) 만이 시스템의 컴파일러 sizeof(char)에서 4로 정의 할 수 있습니까? sizeof(char)1이 될 것이지만 char은 32 비트 ( CHAR_BIT매크로)를 갖습니다.

Update2 : 하지만 sizeof 결과는 바이트가 아닙니다! CHAR의 크기입니다. 그리고 char는 2 바이트 또는 7 비트 일 수 있습니다.

Update3 : 좋습니다. 모든 기계에는 sizeof(char) == 1. 그러나 어떤 기계가 CHAR_BIT > 8있습니까?


4
C99 표준 준수가 걱정됩니다. 저는 C99 컴파일러와 밀접하게 작업합니다
osgx 2010

2
유니 코드가 더욱 중요해지면서 유니 코드 문자를 char(대신 wchar) 로 사용하는 비표준 컴파일러가 나올 수 있습니다 sizeof(char).
Chip Uni

14
sizeof (char)가 1, 유니 코드 여부에 관계없이 C 컴파일러는 없습니다.
nos

6
@Chip : sizeof(char)문자가 32 비트 인 경우에도 항상 1입니다 (일부 시스템에서 발생). C에는 재미있는 사마귀가 많이 있습니다.
Nick Bastin

2
C 표준의 모든 버전에서는 CHAR_BIT가 최소 8이어야합니다. CHAR_BIT == 7 일 수 없으며 표준을 준수 할 수 없습니다. 기계 CHAR_BIT을하는 그러나, 그것은 완벽하게 가능하다> 8. 올드 크레이 기계했던, 내가 (믿는 sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)사람들에, 나는 여부를 기억하지 sizeof(int) == sizeof(long)CHAR_BIT이 32 또는 64이었다 여부, 나는 32이었다 기대, 나는 생각 sizeof(long) == 1도. ( Cray C 매뉴얼에 대한 참조는 찾을 수 있지만 온라인 액세스는 찾을 수 없습니다 .)
Jonathan Leffler

답변:


91

항상 C99, 섹션 6.5.3.4에서 하나입니다.

유형이 char, unsigned char 또는 signed char 인 피연산자 (또는 정규화 된 버전)에 적용하면 결과는 1입니다.

편집 : 질문의 일부가 아니라 Harbison and Steele, 3rd ed. (c99 이전) p. 148 :

저장 단위는 한 문자가 차지하는 저장 용량으로 간주됩니다. char따라서 유형의 개체 크기는 1입니다.

편집 : 업데이트 된 질문에 대한 답변으로 Harbison과 Steele의 다음 질문과 답변이 적절합니다 (ibid, Ex. 4 of Ch. 6).

유형 char이 -2,147,483,648에서 2,147,483,647까지의 값을 나타낼 수 있는 C 구현을 가질 수 있습니까? 그렇다면 sizeof(char) 그 구현 아래에 무엇이 있을까요? 유형의 최소 및 최대 범위는 무엇입니까?int 무엇입니까?

답변 (ibid, p. 382) :

구현시 32 비트를 사용하여 type을 나타내는 것이 허용됩니다 (낭비되는 경우) char. 구현 여부에 관계없이 sizeof(char) 은 항상 1입니다.

이것은 바이트가 8 비트이고 그 char중 4 바이트 인 경우를 구체적으로 다루지는 않지만 (실제로 c99 정의로는 불가능합니다. 아래 참조)sizeof(char) = 1 항상 c99 표준과 Harbison 및 Steele에서 분명합니다.

편집 : 사실 (이 당신의 UPD이 질문에 대한 응답이다), 지금까지의 C99에 관한 한 sizeof(char) 것입니다 다시 섹션 6.5.3.4에서 바이트 :

sizeof 연산자는 피연산자의 크기 (바이트)를 산출합니다.

따라서 위의 인용문과 결합하면 8 비트의 바이트와 char4 바이트의 바이트는 불가능합니다. c99의 경우 바이트는 char.

7 비트 가능성에 대한 귀하의 언급에 대한 답변 char: 이것은 c99에서는 불가능합니다. 표준의 섹션 5.2.4.2.1에 따라 최소값 은 8입니다.

구현 정의 값은 같 거나 커야합니다. 은 동일한 부호를 사용하여 표시된 합니다.

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

 **CHAR_BIT 8**

— 서명 된 문자 유형의 객체에 대한 최소값

**SCHAR_MIN -127//−(27−1)** 

— signed char 유형의 객체에 대한 최대 값

**SCHAR_MAX +127//27−1** 

— unsigned char 유형의 객체에 대한 최대 값

**UCHAR_MAX 255//28−1** 

— char 유형의 객체에 대한 최소값

**CHAR_MIN**    see below 

— char 유형의 객체에 대한 최대 값

**CHAR_MAX**    see below

[...]

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


9
추가 참고. 문자가 몇 비트인지 알려주는 CHAR_BITS 매크로가 있습니다.
nos

1
이 훌륭한 책의 전체 데이터는 Harbison과 Steele의 것입니다. C : A Reference Manual, Third Edition, Prentice Hall, 1991
osgx

2
char 유형으로 작업하고 있고 언어에 1 크기가 필요하다는 것을 알고 있다면 항상 중복 sizeof (char)를 두는 것이 좋은 생각 인 이유는 무엇입니까?

1
(a) 및 (c) 해결하기를 바랄 수 없거나 해결에 가까워 질 수없는 훨씬 더 심각한 결과가 있습니다. 또한 YAGNI. (b)와 같은 사람은 한 번만 말하면됩니다 --- 내 코드의 모든 줄에서 그들을 가르 칠 필요는 없습니다. 그러나 사용에는 단점이 있습니다 sizeof(char). 토론 / 확인 / 등의 또 다른 항목입니다. 당신의 코딩 규칙 / 표준 / 지침에서, 당신이 정말로 C를 알고 있고 무엇이 틀렸는 지 궁금해하는 시간을 낭비하고, 시각적 / 정신적 / 텍스트 라인 "대역폭"을 차지합니다.

1
@Ramashalanka : 예, 컴파일 된 코드는 동일합니다. 가독성에 관한 모든 문제와 내가 말하는 소스 코드를 사람들이 사용하는 방법입니다. (그리고 FWIW, 여기에 괜찮은 +1 답변이 있다고 생각합니다. "항상 sizeof (char)를 사용하여"오류가 발생하고 사소한 문제라도 저에게 핫 버튼 문제라고 생각합니다.)

21

sizeof(char)4 인 기계는 없습니다 . 항상 1 바이트입니다. 이 바이트에는 32 비트가 포함될 수 있지만 C 컴파일러에 관한 한 1 바이트입니다. 자세한 내용은 실제로 C ++ FAQ 26.6을 참조 하도록하겠습니다 . 이 링크는 잘 다루고 있으며 C ++가 C에서 모든 규칙을 얻었음을 확신 합니다. 8 비트보다 큰 문자에 대해서는 comp.lang.c FAQ 8.10 을 참조 할 수도 있습니다 .

Upd2 :하지만 sizeof 결과는 바이트가 아닙니다! CHAR의 크기입니다. 그리고 char는 2 바이트 또는 7 비트 일 수 있습니다.

예, 바이트입니다. 다시 말하겠습니다. sizeof(char)C 컴파일러에 따르면 1 바이트입니다. 사람들이 구어체로 바이트 (8 비트)라고 부르는 것이 C 컴파일러가 바이트라고 부르는 것과 반드시 ​​같지는 않습니다. C 바이트의 비트 수는 시스템 아키텍처에 따라 다릅니다. 또한 최소 8 개가 보장됩니다.


3
부디!!! C ++는 C (C99)와는 정말 다른 언어입니다. 이 질문은 일반 C에 관한 것입니다.
osgx 2010

<strike> 컴퓨터 / CPU가 8 비트 바이트에 액세스 할 수없는 경우 어떻게해야합니까? 정렬되지 않은 액세스는 금지됩니다. </ strike> (x86 malloc에서도 정렬 된 데이터를 반환하고 4 바이트의 배수로 메모리를 할당합니다.) <strike> 그러면 CHAT_BIT는 8보다 커집니다. 예, 그러한 플랫폼은 다소 특별 할 수 있습니다. </ strike >
osgx

10
@osgx, 나는 사람들이 C와 C ++를 섞으려고 할 때 당신이 방금했던 것처럼 비명을 지르는 경향이 있습니다. 하지만 이 경우에는 C ++ FAQ 항목 하나가 C에도 똑같이 적용된다고 생각 합니다.
Michael Kristofik

3
"8 비트"의 올바른 이름은 옥텟입니다. C 표준은 문자 크기 인 객체에 "바이트"라는 단어를 사용합니다. 다른 사람들은 종종 "옥텟"을 의미 할 때 다른 방식으로 "바이트"라는 단어를 사용할 수 있지만, C (및 C ++ 또는 Objective-C)에서는 "문자 크기의 객체"를 의미합니다. 문자는 8 비트 이상이거나 8 진수 이상일 수 있지만 항상 1 바이트입니다.
gnasher729 2014

9

PDP-10 및 PDP-11 이있었습니다.

최신 정보: PDP-10 용 C99 컴파일러는 없습니다.

Analog Devices 32 비트 SHARC DSP의 일부 모델에는 CHAR_BIT = 32가 있고 TMS32F28xx의 Texas Instruments DSP에는 CHAR_BIT = 16이 있습니다. 보도 .

업데이트 : CHAR_BIT = 9 인 PDP-10 용 GCC 3.2 가 있습니다 (해당 아카이브에서 include / limits.h 확인).


1
유사하지만 C가 아닌 언어의 구현을 C와 혼동하지 마십시오. "C99 표준 준수가 걱정됩니다. 저는 C99 컴파일러와 긴밀하게 협력합니다."라고 말했습니다.

2
@Roger : GCC에서 버그로 간주되는 극단적 인 경우를 다루지 않는 한 C99를 준수하지 않는 GCC3를 호출하는 것은 공정하지 않습니다.
Joshua

1
@Joshua, Roger가 K & R 및 pcc 역사적인 컴파일러에 대해 말하는 것 같습니다. 또한이 포트로 컴파일 할 때 C99 준수 테스트 스위트가 PDP-10에서 실행되기 전에 C99 준수라고 주장하는 것도 공정하지 않습니다 (포팅 및 머신 자체에서 버그가있을 수 있음). 그러나 x86의 GCC3.2와 마찬가지로 C99 표준에 가까울 것으로 예상 할 수 있습니다.
osgx 2010

1
@Joshua : C99에서 CHAR_BIT는 8보다 클 수 있지만 sizeof (char)는 여전히 1이어야합니다 (이 답변은 그 주석을 남겼을 때 훨씬 달랐습니다). 나는 GCC3 비준수라고 부르지 않으며 C89는 여기서 BTW라는 동일한 요구 사항을 만듭니다. 나는 그 텍스트를 인용하여 osgx가 C99 컴플라이언스에 대해 걱정하고 C99 컴파일러를 사용한다고 말했는데 왜 C99가 아닌 컴파일러에 대해 걱정하는 것일까 요?

2
여기에 PDP-10 GCC의 작성자. CHAR_BIT 9하지만를 sizeof (문자)는 여전히 1입니다
라스 Brinkhoff
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.