[解決済み] sizeof(char) != 1, or at least CHAR_BIT > 8 のマシンはあるか?
質問
以下のようなマシン (またはコンパイラ) はありますか?
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に等しくなければならない。
関連
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
[解決済み] ⑭と⑯は何のためにあるのですか?
-
[解決済み] C 言語で const char* を char* に変換するには?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] gccの__attribute__((packed))は大丈夫でしょうか?/ #pragma pack unsafe?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
解決済み] g++ コンパイルエラー: ')'トークンの前に一次式があることが予想される
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
[解決済み] Code::Blocks アプリケーションをコンパイルできない
-
[解決済み] char *とchar[]の違い [重複]
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] 8bit char以外を搭載しているプラットフォームは?