102

マシン (またはコンパイラ) はどこにありsizeof(char) != 1ますか?

C99標準は、sizeof(char)標準準拠の実装では正確に1でなければならないと言っていますか? もしそうなら、セクション番号と引用を教えてください。

更新:uint32_tバイトをアドレス指定できないマシン (CPU) を使用している場合 (最小読み取りは 4 バイト、整列)、4 バイト ( ) しかアドレス指定できない場合、このマシンのコンパイラは 4 に定義できsizeof(char)ますか? sizeof(char)1 になりますが、char は 32 ビットになります(CHAR_BITマクロ)

Update2: しかし sizeof 結果は BYTES ではありません! CHAR のサイズです。char は 2 バイトにすることも、7 ビットにすることもできますか?

Update3: わかりまし た。すべてのマシンにはsizeof(char) == 1. しかし、どのマシンが持っていCHAR_BIT > 8ますか?

4

3 に答える 3

98

C99 のセクション 6.5.3.4 では常に 1 です。

型 char、unsigned char、または signed char (またはその修飾バージョン) を持つオペランドに適用されると、結果は 1 になります。

編集:あなたの質問の一部ではありませんが、ハービソンとスティールからの関心のために。C: A Reference Manual、Third Edition、Prentice Hall、1991 (pre c99) p. 148:

ストレージ ユニットは、1 文字が占有するストレージの量と見なされます。charしたがって、型のオブジェクトのサイズは1 です。

編集:更新された質問への回答として、Harbison と Steele からの次の質問と回答が関連しています (同上、Ch. 6 の Ex. 4)。

char型が -2,147,483,648 から 2,147,483,647 までの範囲の値を表すことができるC 実装を持つことは許されますか? もしそうなら、sizeof(char) その実装の下には何がありますか? type の最小範囲と最大範囲はint?

回答 (同上、p. 382):

実装で type を表すために 32 ビットを使用することは (無駄であれば) 許可されていますchar。実装に関係なく、 の値 sizeof(char)は常に 1 です。

これは、たとえば、バイトが 8 ビットでchar、そのうちの 4 バイトである場合 (c99 の定義では実際には不可能です。以下を参照) に特に対処していませんsizeof(char) = 1が、c99 標準および Harbison と Steele から常に明らかな事実です。

編集:実際(これはupd 2の質問への回答です)、c99に関する限り、セクション6.5.3.4からのバイト単位ですsizeof(char)

sizeof 演算子は、そのオペランドのサイズ (バイト単位) を生成します

したがって、上記の引用と組み合わせると、8 ビットのバイトでありchar、そのうちの 4 バイトは不可能です。c99 の場合、1 バイトはchar.

7ビットの可能性についてのあなたの言及への答えとしてchar:これはc99では不可能です。標準のセクション 5.2.4.2.1 によると、最小値は 8 です。

それらの実装定義の値は、同じ符号で示されているものと同じかそれ以上の大きさである必要があります[私の強調]。

— ビットフィールド (バイト) ではない最小オブジェクトのビット数

 **CHAR_BIT 8**

— signed char 型のオブジェクトの最小値

**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 に等しくなければなりません。

于 2010-02-07T01:03:58.303 に答える
23

が 4 のマシンはありませんsizeof(char)。常に 1 バイトです。そのバイトには 32 ビットが含まれる場合がありますが、C コンパイラに関する限り、それは 1 バイトです。詳細については、C++ FAQ 26.6を参照してください。そのリンクはそれをかなりうまくカバーしており、C ++がCからこれらのルールをすべて取得したことはかなり確信しています。また、8ビットより大きい文字については、 comp.lang.c FAQ 8.10を参照してください。

Upd2: しかし sizeof 結果は BYTES ではありません! CHAR のサイズです。char は 2 バイトにすることも、7 ビットにすることもできますか?

はい、バイトです。もう一度言わせてください。 sizeof(char)C コンパイラによると 1 バイトです。口語的にバイト (8 ビット) と呼ぶものは、C コンパイラがバイトと呼ぶものと必ずしも同じではありません。C バイトのビット数は、マシンのアーキテクチャによって異なります。また、少なくとも 8 であることが保証されています。

于 2010-02-07T01:57:30.130 に答える
12

PDP-10とPDP-11はそうでした。

更新:PDP-10用のC99コンパイラはありません。

伝えられるところによると、アナログ・デバイセズの32ビットSHARCDSPの一部のモデルにはCHAR_BIT= 32があり、TMS32F28xxのTexasInstrumentsDSPにはCHAR_BIT=16があります。

更新: CHAR_BIT =9のPDP-10用のGCC3.2があります(そのアーカイブのinclude / Limits.hを確認してください)。

于 2010-02-07T02:41:00.240 に答える