
No.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ビット)にせざるを得ません。
この回答への補足
”もしchar型を8ビットにするのであれば、各ワードの上位なのか下位なのかを表すために、最低もう1ビット必要になります”とのご回答がありましたが、1ビット増えたら9ビットそれゆえ18ビットあれば足りると思うのですが、なにゆえ”結果として2バイト(=16ビット)ではおさまらず、実行効率を考えるとsizeof(char*)を4バイト(=32ビット)にせざるを得ません。”と言う結論に成るのか今ひとつ理解できません。何故まだ初心者ですので、その所を詳しくご教授できましたら幸いです。宜しく願います。
補足日時:2008/05/15 15:39No.4
- 回答日時:
主にCPUが原因でCHAR_BITが8以外になります。
1バイトは常に8ビットと言うわけではなく、9ピットであるCPUも存在するわけです。
UnixやC言語は最初にPDP-11用として開発されたわけですが、このPDPシリーズには36ビットや18ビットのアーキテクチャもあったのでその辺を考慮して1バイトのビット数が可変になっているのだと思います。
なお、通信の世界で8bitであることを厳密に示すためにはオクテットという言葉が使われます。
# CrayのCコンパイラはCHAR_BITが64であると聞いたとこがあるけど、真偽のほどは不明です。
No.3
- 回答日時:
理屈の上では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バイト(最小単位)と規定されていると考えていたのですが、その事と矛盾してしまうのですが。宜しくご教授願います。
No.2
- 回答日時:
もともとはCPU/ハードの問題だったはずですが。
かつてミニコンと呼ばれたコンピュータ(DEC PDPシリーズが有名)は1バイトが8ビットではありませんでした。
今でも制御用の特殊コンピュータでは1バイトが8ビットでないものが存在します。
1バイト(char)は文字を表せる最小単位、すなわちコンピュータがひとかたまりとして扱える数の最小単位なので、そのコンピュータのアーキテクチャ(構造)に依存します。
C言語の成り立ちはUNIXというOSと密接な関わりがあり、UNIXは当時ミニコン、スパコンと呼ばれたアーキテクチャの異なるいろいろなコンピュータ上で動作していたため、必然的にC言語はアーキテクチャの違いを考慮した仕様が求められた、ということだと思います。
No.1
- 回答日時:
>CPU等ハードの問題なのか、文字コード等ソフトの問題なのか
どっちも関係ありません。
C言語の仕様で、char型が1バイトであることが要求され、
これがCHAR_BIT マクロで定義されます。
CHAR_BIT マクロは、<limits.h> ヘッダで定義され少なくとも 8 以上
に定義されることが保証されているので8以上であるならそういった
環境はC言語の規格上認められるわけです。
つまり、C言語上で1バイトは8ビット以上なら8ビット以外でも
許容されるからそういう環境が存在するということです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
ピクセル,dpiから容量(バイト...
-
全角半角を調べるライブラリ関...
-
10Mバイトて文字数に すると何...
-
64bit対応
-
memcmp バイナリデータの比較方法
-
ラベル表示の桁をそろえたいです。
-
Console.writeLineで文字化け
-
COBOLのCOMP形式について
-
エクセルシート名の制限を変更...
-
C++ Builderで文字列をバイトに...
-
ビットスワップとバイトスワッ...
-
char str[256]の256の意味は?
-
「1TB」のHDDに日本語は何字入...
-
CRC計算方法
-
GetWindowTextでアドレスバーか...
-
sedコマンドで全ての2バイト文...
-
日付時刻を4バイトに
-
3バイト文字(UTF-8)をprintfで...
-
Visual Basicでパック10進(2進...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
-
COBOLのCOMP形式について
-
バイト列とバイナリ列の違いが...
-
エクセルシート名の制限を変更...
-
ピクセル,dpiから容量(バイト...
-
ビットスワップとバイトスワッ...
-
テキストBOXの入力制限について
-
機種依存文字をチェックしたい。
-
「1TB」のHDDに日本語は何字入...
-
C++ Builderで文字列をバイトに...
-
全角半角を調べるライブラリ関...
-
SQLで1バイト、2バイト混在...
-
VB6とSQL Serverの桁の扱い方に...
-
jis x 0208 について
-
VBAでShift-JISのURLエンコード
-
この関数はどのプログラミング...
-
COBOL PICTUREで X,S,Vの意味
-
半角、全角の判別方法
おすすめ情報