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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
CD R の書き込み
-
char str[256]の256の意味は?
-
URLは最高何文字まで可能なので...
-
バイト列とバイナリ列の違いが...
-
:(コロン)のKeyCode
-
「1TB」のHDDに日本語は何字入...
-
VBAでShift-JISのURLエンコード
-
MIDIにおいて ステータスバイト...
-
GetWindowTextでアドレスバーか...
-
C言語について
-
ビットスワップとバイトスワッ...
-
1バイト文字から2バイト文字に変換
-
WMAのタグ情報はどこにある?
-
ピクセル,dpiから容量(バイト...
-
シフトJISの2バイト文字
-
486のpush %ds 命令
-
pythonでバイナリデータを配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
エクセルシート名の制限を変更...
-
char str[256]の256の意味は?
-
COBOLのCOMP形式について
-
バイト列とバイナリ列の違いが...
-
ビットスワップとバイトスワッ...
-
VBAでShift-JISのURLエンコード
-
ピクセル,dpiから容量(バイト...
-
「1TB」のHDDに日本語は何字入...
-
SQLで1バイト、2バイト混在...
-
バイナリとBCDコード
-
Javaで日本語1文字のバイト数
-
UCS-2の一覧表が欲しい
-
3バイト文字(UTF-8)をprintfで...
-
:(コロン)のKeyCode
-
【VB2005】テキストボックス内...
-
64bit対応
-
URLは最高何文字まで可能なので...
-
機種依存文字をチェックしたい。
おすすめ情報