web-dev-qa-db-ja.com

sizeof(char)!= 1、または少なくともCHAR_BIT> 8のマシンがありますか?

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_がありますか?

89
osgx

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

89
Ramashalanka

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であることが保証されています。

18

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を確認してください)。

9
osgx