- ベストアンサー
CHAR_BITについて
”CHAR_BITは開発環境に依存する為、他の環境では正しく動作しない可能性があります。つまり、普通は1バイトが 8 ビットですが、なかには 9 ビットというコンピュータが存在します”と言う事を、C言語の本で読んだのですが、何ゆえCHAR_BITが開発環境によりビット数が違うのか解りません。CPU等ハードの問題なのか、文字コード等ソフトの問題なのか解りません。どなたか、具体的にご教授できたら幸いです。宜しく願います。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> "場合によってはsizeof(char*) > sizeof(int*)になっていしまう可能性があり、非常に不便です。"とご回答がありましたが、これはポインタ型のバイトサイズの事でしょうか。 ポインタ型のバイト数です。 > またその様な事は、どのような事例でおきるのでしょうか。 例えば、アドレス空間が16ビット×65536ワードのアーキテクチャを考えてみてください。 この場合おそらくは、short/int型:16ビット、long型:32ビットとなるでしょう。short*/int*/long*はそれぞれ16ビットで表現可能です。もしchar型を8ビットにするのであれば、各ワードの上位なのか下位なのかを表すために、最低もう1ビット必要になります。結果として2バイト(=16ビット)ではおさまらず、実行効率を考えるとsizeof(char*)を4バイト(=32ビット)にせざるを得ません。
その他の回答 (4)
- jx-word
- ベストアンサー率40% (38/94)
主にCPUが原因でCHAR_BITが8以外になります。 1バイトは常に8ビットと言うわけではなく、9ピットであるCPUも存在するわけです。 UnixやC言語は最初にPDP-11用として開発されたわけですが、このPDPシリーズには36ビットや18ビットのアーキテクチャもあったのでその辺を考慮して1バイトのビット数が可変になっているのだと思います。 なお、通信の世界で8bitであることを厳密に示すためにはオクテットという言葉が使われます。 # CrayのCコンパイラはCHAR_BITが64であると聞いたとこがあるけど、真偽のほどは不明です。
お礼
大変参考になりました。有難うございました。
- jacta
- ベストアンサー率26% (845/3158)
理屈の上ではCPUやハードウェアに関係なくCHAR_BITを決めることができますが、現実にはプロセッサのアーキテクチャによります。CPUやではなく「プロセッサ」と書いたのは、最近のCHAR_BITが8ではない環境にはDSPがそれなりにあるからです。 CHAR_BITが8ビットではない環境、例えば16ビットの環境の場合、データにアクセスできる最小の単位が16ビットである場合がほとんどです。そうした環境では、無理やり8ビット単位で扱おうとすると、いったん16ビットで読み込んでからANDやシフトで8ビットに加工せざるを得ず、非常に効率が悪くなりますし、場合によってはsizeof(char*) > sizeof(int*)になっていしまう可能性があり、非常に不便です。
お礼
参考になりました。有難うございました。
補足
"場合によってはsizeof(char*) > sizeof(int*)になっていしまう可能性があり、非常に不便です。"とご回答がありましたが、これはポインタ型のバイトサイズの事でしょうか。 またその様な事は、どのような事例でおきるのでしょうか。 あるいは、ポインタではなくchar 、int 型のバイトサイズとすればchar型が1バイト(最小単位)と規定されていると考えていたのですが、その事と矛盾してしまうのですが。宜しくご教授願います。
- tokichim
- ベストアンサー率42% (88/205)
もともとはCPU/ハードの問題だったはずですが。 かつてミニコンと呼ばれたコンピュータ(DEC PDPシリーズが有名)は1バイトが8ビットではありませんでした。 今でも制御用の特殊コンピュータでは1バイトが8ビットでないものが存在します。 1バイト(char)は文字を表せる最小単位、すなわちコンピュータがひとかたまりとして扱える数の最小単位なので、そのコンピュータのアーキテクチャ(構造)に依存します。 C言語の成り立ちはUNIXというOSと密接な関わりがあり、UNIXは当時ミニコン、スパコンと呼ばれたアーキテクチャの異なるいろいろなコンピュータ上で動作していたため、必然的にC言語はアーキテクチャの違いを考慮した仕様が求められた、ということだと思います。
お礼
参考になりました。有難うございます。
- aris-wiz
- ベストアンサー率38% (96/252)
>CPU等ハードの問題なのか、文字コード等ソフトの問題なのか どっちも関係ありません。 C言語の仕様で、char型が1バイトであることが要求され、 これがCHAR_BIT マクロで定義されます。 CHAR_BIT マクロは、<limits.h> ヘッダで定義され少なくとも 8 以上 に定義されることが保証されているので8以上であるならそういった 環境はC言語の規格上認められるわけです。 つまり、C言語上で1バイトは8ビット以上なら8ビット以外でも 許容されるからそういう環境が存在するということです。
補足
”もしchar型を8ビットにするのであれば、各ワードの上位なのか下位なのかを表すために、最低もう1ビット必要になります”とのご回答がありましたが、1ビット増えたら9ビットそれゆえ18ビットあれば足りると思うのですが、なにゆえ”結果として2バイト(=16ビット)ではおさまらず、実行効率を考えるとsizeof(char*)を4バイト(=32ビット)にせざるを得ません。”と言う結論に成るのか今ひとつ理解できません。何故まだ初心者ですので、その所を詳しくご教授できましたら幸いです。宜しく願います。