ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4020859 CHAR_BITについて
質問者:PHYOPHYO ”CHAR_BITは開発環境に依存する為、他の環境では正しく動作しない可能性があります。つまり、普通は1バイトが 8 ビットですが、なかには 9 ビットというコンピュータが存在します”と言う事を、C言語の本で読んだのですが、何ゆえCHAR_BITが開発環境によりビット数が違うのか解りません。CPU等ハードの問題なのか、文字コード等ソフトの問題なのか解りません。どなたか、具体的にご教授できたら幸いです。宜しく願います。
困り度:
  • すぐに回答を!
質問投稿日時:
08/05/14 05:47
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.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ビット)にせざるを得ません。
回答者:jacta
種類:回答
どんな人:専門家
自信:参考意見
回答日時:
08/05/15 11:58
この回答への補足”もしchar型を8ビットにするのであれば、各ワードの上位なのか下位なのかを表すために、最低もう1ビット必要になります”とのご回答がありましたが、1ビット増えたら9ビットそれゆえ18ビットあれば足りると思うのですが、なにゆえ”結果として2バイト(=16ビット)ではおさまらず、実行効率を考えるとsizeof(char*)を4バイト(=32ビット)にせざるを得ません。”と言う結論に成るのか今ひとつ理解できません。何故まだ初心者ですので、その所を詳しくご教授できましたら幸いです。宜しく願います。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.4 主にCPUが原因でCHAR_BITが8以外になります。

1バイトは常に8ビットと言うわけではなく、9ピットであるCPUも存在するわけです。
UnixやC言語は最初にPDP-11用として開発されたわけですが、このPDPシリーズには36ビットや18ビットのアーキテクチャもあったのでその辺を考慮して1バイトのビット数が可変になっているのだと思います。
なお、通信の世界で8bitであることを厳密に示すためにはオクテットという言葉が使われます。

# CrayのCコンパイラはCHAR_BITが64であると聞いたとこがあるけど、真偽のほどは不明です。
回答者:jx-word
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/05/14 23:41
この回答へのお礼大変参考になりました。有難うございました。

回答

ANo.3 理屈の上ではCPUやハードウェアに関係なくCHAR_BITを決めることができますが、現実にはプロセッサのアーキテクチャによります。CPUやではなく「プロセッサ」と書いたのは、最近のCHAR_BITが8ではない環境にはDSPがそれなりにあるからです。

CHAR_BITが8ビットではない環境、例えば16ビットの環境の場合、データにアクセスできる最小の単位が16ビットである場合がほとんどです。そうした環境では、無理やり8ビット単位で扱おうとすると、いったん16ビットで読み込んでからANDやシフトで8ビットに加工せざるを得ず、非常に効率が悪くなりますし、場合によってはsizeof(char*) > sizeof(int*)になっていしまう可能性があり、非常に不便です。
回答者:jacta
種類:回答
どんな人:専門家
自信:参考意見
回答日時:
08/05/14 11:08
この回答への補足"場合によってはsizeof(char*) > sizeof(int*)になっていしまう可能性があり、非常に不便です。"とご回答がありましたが、これはポインタ型のバイトサイズの事でしょうか。
またその様な事は、どのような事例でおきるのでしょうか。
あるいは、ポインタではなくchar 、int 型のバイトサイズとすればchar型が1バイト(最小単位)と規定されていると考えていたのですが、その事と矛盾してしまうのですが。宜しくご教授願います。
この回答へのお礼参考になりました。有難うございました。

回答良回答10pt

ANo.2 もともとはCPU/ハードの問題だったはずですが。

かつてミニコンと呼ばれたコンピュータ(DEC PDPシリーズが有名)は1バイトが8ビットではありませんでした。
今でも制御用の特殊コンピュータでは1バイトが8ビットでないものが存在します。

1バイト(char)は文字を表せる最小単位、すなわちコンピュータがひとかたまりとして扱える数の最小単位なので、そのコンピュータのアーキテクチャ(構造)に依存します。

C言語の成り立ちはUNIXというOSと密接な関わりがあり、UNIXは当時ミニコン、スパコンと呼ばれたアーキテクチャの異なるいろいろなコンピュータ上で動作していたため、必然的にC言語はアーキテクチャの違いを考慮した仕様が求められた、ということだと思います。
回答者:tokichim
種類:回答
どんな人:経験者
自信:参考意見
回答日時:
08/05/14 10:46
この回答へのお礼参考になりました。有難うございます。

回答

ANo.1 >CPU等ハードの問題なのか、文字コード等ソフトの問題なのか
どっちも関係ありません。
C言語の仕様で、char型が1バイトであることが要求され、
これがCHAR_BIT マクロで定義されます。

CHAR_BIT マクロは、<limits.h> ヘッダで定義され少なくとも 8 以上
に定義されることが保証されているので8以上であるならそういった
環境はC言語の規格上認められるわけです。

つまり、C言語上で1バイトは8ビット以上なら8ビット以外でも
許容されるからそういう環境が存在するということです。
回答者:aris-wiz
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/14 09:56
この回答へのお礼この回答にお礼をつける(質問者のみ)