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
_がありますか?
C99のセクション6.5.3.4には常に1つあります。
Char型、unsigned char型、signed char型(またはその修飾バージョン)のオペランドに適用すると、結果は1になります。
編集:あなたの質問の一部ではありませんが、ハービソンとスティール、第3版からの関心のため(c99以前)p。 148:
ストレージユニットは、1文字が占めるストレージの量と見なされます。したがって、タイプ
char
のオブジェクトのサイズは1です。
編集:更新された質問への回答では、HarbisonとSteeleからの次の質問と回答が関連しています(同上、第6章の例4)。
タイプ
char
が-2,147,483,648から2,147,483,647の範囲の値を表現できるC実装を持つことは許されますか?もしそうなら、その実装ではsizeof(char)
は何でしょうか?タイプint
の最小範囲と最大範囲は何ですか?
回答(同上、382ページ):
実装がタイプ
char
を表すために32ビットを使用することは(無駄な場合)許可されます。実装に関係なく、sizeof(char)
の値は常に1です。
これは、バイトが8ビットであり、char
が4バイトである場合(c99定義では実際には不可能、以下を参照)の場合には特に対処しませんが、sizeof(char) = 1
は常にc99標準およびHarbison and Steeleから明らかです。
編集:実際には(これはあなたのupd 2の質問への応答です)、c99に関する限り、sizeof(char)
isバイト単位で、セクション6.5.3.4から再び:
Sizeof演算子は、オペランドのサイズ(バイト単位)を返します
したがって、上記の引用と組み合わせて、8ビットのバイトと、それらの4バイトとしてのchar
は不可能です。c99の場合、バイトは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に等しくなければなりません。
sizeof(char)
が4のマシンはありません。これは常に1バイトです。そのバイトには32ビットが含まれる場合がありますが、Cコンパイラに関する限り、1バイトです。詳細については、実際に C++ FAQ 26.6 を指すようにします。このリンクはそれをかなりよくカバーしており、 Cのルール。8ビットを超える文字については comp.lang.c FAQ 8.1 を参照することもできます。
Upd2:ただし、sizeof結果はBYTESではありません! CHARのサイズです。また、charは2バイト、または(おそらく)7ビットにすることができますか?
はい、バイトです。もう一度言ってください。 sizeof(char)
は、Cコンパイラーによると1バイトです。人々が口語でバイト(8ビット)と呼ぶものは、Cコンパイラがバイトと呼ぶものと必ずしも同じではありません。 Cバイトのビット数は、マシンのアーキテクチャによって異なります。また、少なくとも8であることが保証されています。
PDP-10 およびPDP-11 だった。
更新: pDP-10用のC99コンパイラはありません。
Analog Devices 32ビットSHARC DSPの一部のモデルにはCHAR_BIT = 32があり、TMS32F28xxのTexas Instruments DSPにはCHAR_BIT = 16、 報告されている があります。
更新: PDP-10のGCC 3.2 とCHAR_BIT = 9があります(そのアーカイブのinclude/limits.hを確認してください)。