1. ホーム
  2. c

[解決済み] sizeof(char) != 1, or at least CHAR_BIT > 8 のマシンはあるか?

2022-12-05 22:16:03

質問

以下のようなマシン (またはコンパイラ) はありますか? sizeof(char) != 1 ?

C99規格 は、次のように言っています。 sizeof(char) は正確に1でなければならないと書いてありますか?もしそうなら、セクション番号と引用をお願いします。

更新してください。 バイト単位でアドレス指定できないマシン(CPU)があったとして(最小読み出しは4バイト、アラインド)、4-sバイトのアドレス指定しかできない場合( uint32_t ), は、このマシンのためのコンパイラで sizeof(char) を 4 に定義できますか? sizeof(char) は1になりますが、charは32ビットになります。 ( CHAR_BIT マクロ)

更新2です。 しかし、sizeof resultはBYTESではありません!それはcharのサイズです。そして、charは2バイト、または(もしかしたら)7ビットになりますか?

更新3です。 OK すべてのマシンに sizeof(char) == 1 . しかし、どのようなマシンが CHAR_BIT > 8 ?

どのように解決するのですか?

C99の6.5.3.4項では常に1つです。

を持つオペランドに適用された場合、そのオペランドは タイプchar、unsigned char、またはsigned char、またはその修飾版)。 の場合、結果は 1 です。

編集:あなたの質問の一部ではありませんが、興味から ハービソンとスティールの C: A Reference Manual, 第3版, プレンティスホール, 1991 (C99以前)のp.148を参照してください。

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

編集:更新された質問に対する答えとして、Harbison and Steeleの以下の問答が関連しています(同書、Ch.6のEx.4)。

C の実装で、型 char が が以下の範囲の値を表すようなCの実装は可能ですか? -2,147,483,648から2,147,483,647までの値を表すことができるような実装がありますか?もしそうなら sizeof(char) はどうなるのでしょうか?その場合 の最小範囲と最大範囲はどうなるでしょうか? タイプ int ?

回答(同上、p.382)。

の実装では、(無駄であるとしても)許されます。 の実装では、32ビットを使って 型を表すために char . 実装に関係なく の値は、実装に関係なく sizeof(char) は常に 1 です。

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

編集:実際(これはあなたのupd 2の質問に対するものです)、c99に関する限りでは sizeof(char) をバイト単位で、再び6.5.3.4節から。

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

ということで、上の引用文と組み合わせると、8ビットのバイトと char をそのうちの4バイトとすることは不可能です:C99ではバイトは char .

7 ビットの可能性についての言及に対する回答として char : これは c99 では不可能です。規格の 5.2.4.2.1 項によると 最小 は8です。

それらの実装で定義された値は、等しくなければならない またはそれ以上 [強調]されたものと同じ符号で示されたものと大きさが等しくなければならない。

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

 **CHAR_BIT 8**

- 符号付きchar型のオブジェクトの最小値

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

- 符号付き文字型オブジェクトの最大値

**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_MINの値はSCHAR_MINと同じであり、CHAR_MAXの値は の値と同じでなければならない。 SCHAR_MAXと同じでなければならない。それ以外の場合,CHAR_MINの値は0とする。 CHAR_MIN の値は 0 とし,CHAR_MAX の値は SCHAR_MAX とする。 CHAR_MAXは,UCHAR_MAXと同じである。 UCHAR_MAX とする。UCHAR_MAXの値は は,2^CHAR_BIT - 1に等しくなければならない。