• ベストアンサー

CHAR_BITについて

”CHAR_BITは開発環境に依存する為、他の環境では正しく動作しない可能性があります。つまり、普通は1バイトが 8 ビットですが、なかには 9 ビットというコンピュータが存在します”と言う事を、C言語の本で読んだのですが、何ゆえCHAR_BITが開発環境によりビット数が違うのか解りません。CPU等ハードの問題なのか、文字コード等ソフトの問題なのか解りません。どなたか、具体的にご教授できたら幸いです。宜しく願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答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ビット)にせざるを得ません。

PHYOPHYO
質問者

補足

”もしchar型を8ビットにするのであれば、各ワードの上位なのか下位なのかを表すために、最低もう1ビット必要になります”とのご回答がありましたが、1ビット増えたら9ビットそれゆえ18ビットあれば足りると思うのですが、なにゆえ”結果として2バイト(=16ビット)ではおさまらず、実行効率を考えるとsizeof(char*)を4バイト(=32ビット)にせざるを得ません。”と言う結論に成るのか今ひとつ理解できません。何故まだ初心者ですので、その所を詳しくご教授できましたら幸いです。宜しく願います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • jx-word
  • ベストアンサー率40% (38/94)
回答No.4

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

PHYOPHYO
質問者

お礼

大変参考になりました。有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

理屈の上ではCPUやハードウェアに関係なくCHAR_BITを決めることができますが、現実にはプロセッサのアーキテクチャによります。CPUやではなく「プロセッサ」と書いたのは、最近のCHAR_BITが8ではない環境にはDSPがそれなりにあるからです。 CHAR_BITが8ビットではない環境、例えば16ビットの環境の場合、データにアクセスできる最小の単位が16ビットである場合がほとんどです。そうした環境では、無理やり8ビット単位で扱おうとすると、いったん16ビットで読み込んでからANDやシフトで8ビットに加工せざるを得ず、非常に効率が悪くなりますし、場合によってはsizeof(char*) > sizeof(int*)になっていしまう可能性があり、非常に不便です。

PHYOPHYO
質問者

お礼

参考になりました。有難うございました。

PHYOPHYO
質問者

補足

"場合によってはsizeof(char*) > sizeof(int*)になっていしまう可能性があり、非常に不便です。"とご回答がありましたが、これはポインタ型のバイトサイズの事でしょうか。 またその様な事は、どのような事例でおきるのでしょうか。 あるいは、ポインタではなくchar 、int 型のバイトサイズとすればchar型が1バイト(最小単位)と規定されていると考えていたのですが、その事と矛盾してしまうのですが。宜しくご教授願います。

全文を見る
すると、全ての回答が全文表示されます。
  • tokichim
  • ベストアンサー率42% (88/205)
回答No.2

もともとはCPU/ハードの問題だったはずですが。 かつてミニコンと呼ばれたコンピュータ(DEC PDPシリーズが有名)は1バイトが8ビットではありませんでした。 今でも制御用の特殊コンピュータでは1バイトが8ビットでないものが存在します。 1バイト(char)は文字を表せる最小単位、すなわちコンピュータがひとかたまりとして扱える数の最小単位なので、そのコンピュータのアーキテクチャ(構造)に依存します。 C言語の成り立ちはUNIXというOSと密接な関わりがあり、UNIXは当時ミニコン、スパコンと呼ばれたアーキテクチャの異なるいろいろなコンピュータ上で動作していたため、必然的にC言語はアーキテクチャの違いを考慮した仕様が求められた、ということだと思います。

PHYOPHYO
質問者

お礼

参考になりました。有難うございます。

全文を見る
すると、全ての回答が全文表示されます。
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

>CPU等ハードの問題なのか、文字コード等ソフトの問題なのか どっちも関係ありません。 C言語の仕様で、char型が1バイトであることが要求され、 これがCHAR_BIT マクロで定義されます。 CHAR_BIT マクロは、<limits.h> ヘッダで定義され少なくとも 8 以上 に定義されることが保証されているので8以上であるならそういった 環境はC言語の規格上認められるわけです。 つまり、C言語上で1バイトは8ビット以上なら8ビット以外でも 許容されるからそういう環境が存在するということです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 32bitから64bitマシンへのシステム移行

    質問させて頂きます。 ご教示お願いいたします。 32bitサーバで動作しているWebシステムを64bitOSのサーバへ移行することになりました。 そこで、32bitマシンから64bitマシンへのシステム移行をする際に気をつけるべき点をご教授ください。 そもそも可能なのでしょうか。 また、32bit開発マシンでコンパイルし、64bitサーバへ乗せようと考えていますが、 開発マシンとサーバのbit数が違う場合は動作しないこともあり得るのでしょうか。 一応、メーカーへ問い合わせたところ「全く動かないわけではなく、基本的には動く。 但し、動作に保障はできないので、テストを入念に行ってください。」とのことでした。 コンパイルの問題もですが、他のアプリのバージョンも変わってくると思いますが、 以下の問題以外に他にありますでしょうか。 ・.NetFrameworkのバージョン変更(もしかしたら必要ない?) ・MySqlのバージョン変更が生じる(データ移行の際にdumpファイルをロードするだけではダメ?) ver.5.1.44から5.1.58にしようと思っています。 64bit環境での開発は初めてですので、知識が浅いものですからご教授頂けると幸いです。 宜しくお願いいたします。 以下、マシン構成 【現在】  ・開発マシン   OS: WindowsXP Professional2002 SP3 32bit   tool: Microsoft Visual Web Developer 2008 Express Edition .Net: .NET Framework 3.5  ・サーバ   OS: WindowsServer 2003 R2 StandardEdition SP2 32bit   DB: mysql 5.1.44 win32 .Net: .NET Framework 3.5 【新】  ・新サーバ   OS: WindowsServer2008 x64 StandardEdition

  • VS2012 C# バイナリが32bitで動作固定

    文字数制限のため、わかりづらいタイトルになってしまいました。 Windows 7 64bit版のOSにてVisual Studio 2012 for Windows Desktopを 使っています。言語はC#です。 デフォルトでコンパイルしたバイナリが64bit環境にもかかわらず32bitで 動作してしまうので、理由を知りたいです。 手順 1.コンソールやフォームのプロジェクトを新規作成して、ソリューション構成を 「Release」にします。ソリューションプラットホームは「Any CPU」であることを 確認します。 2.コンソールの場合、すぐ終わらないようにMain関数に「Console.ReadKey();」等を 記述します。 3.「すべてを保存」して、「ソリューションのビルド」をします。 4.コンパイルしたバイナリを直接実行すると、「32bitで動作」してしまいます。 5.プロジェクトの「対象のフレームワーク」を「.NET Framework 4」にします。 6.ビルドして実行すると、「64bitで動作」しています。 7.プロジェクトの「対象のフレームワーク」を「.NET Framework 4.5」に戻します。 6.ビルドして実行すると、「64bitで動作」しています。 手順中の 6. と 8. にて「64bitで動作」することは理解できるのですが、4. にて 「32bitで動作」する理由がわかりません。こちらの原因をお教えいただけると 助かります。

  • SPARCのCPUは32bitなのか64bitなのか?

    isainfo -vの結果はOSがサポートしているbitですが、CPUのハードアーキテクチャではないですね。 SPARC(2)450MHzのCPUを使ってきましたが、それは64bitのCPUでしょうか? ありがとうございます。

  • 8個のビットを1バイトとして扱う方法

    1バイトをビット扱いする方法は、 union un_p1dr { unsigned char one_byte ; struct { unsigned char b7:1 ; unsigned char b6:1 ; unsigned char b5:1 ; unsigned char b4:1 ; unsigned char b3:1 ; unsigned char b2:1 ; unsigned char b1:1 ; unsigned char b0:1 ; } bit ; } ; #define pt_da_p1dr (*(volatile union un_p1dr *)0xffffd0) と宣言すれば、pt_da_p1dr.bit.b7 = 1 ;の様にビット扱いが出来ます。 この反対を行える宣言方法は、あるでしょうか? つまり、任意の1ビットを8ビット集め、プログラムでバイトにてアクセスしたいのですが・・・・ ARMなどは、ビットの扱いが容易に可能です。しかし、CPUの周辺関係事情より、バイトでのアクセスが 可能なように、ハード割り当てが出来ません。 従って、現在は、プログラムにて、ビットを集め、バイトにして、アクセスしています。 なにか良い宣言方法があれば、ご伝授していただけないでしょうか? 宜しくお願いいたします。

  • 64bitのWindows7での16bitの動作

    64bitのWindows7の入札を考えています。 そこで2つほどお聞きしたいことがあります。 質問1 主に使っているアプリが32bitなのですが、 64bitでは問題なく動作するのでしょうか。 話ではほとんど問題ないとのことでした。 VB6で作成したアプリが動けば問題ありません。 質問2 16bit時代から愛用しているゲームがあるのですが 16bitとのプログラムは動作しますか。

  • char→10進数

    PICのプラグラムをC言語で書いています。 unsigned charでxを宣言して、xには電圧をAD変換した値(8bit)が代入されます。このxの値を10進数に変換したいのですが、char型をどうすればint型に変換すればいいのか分かりません。 自分なりに作ってみましたが、うまく動作しません。ご教授よろしくお願いします。 /*抜粋*/ unsigned char x; int y,i; float n; ・・・ y=0; for(i=7;i>=0;i--){   n=(((x>>i)<<7)>>7);   if(n==1)n=pow(2,i);   y=y+(int)n; }

  • Windows7の64bit版でプログラム開発環境を整えるには

    Windows7の64bit版でプログラム開発環境を整えるには  Phoenix001と申します。  早速質問に入らせて頂きます。  プログラミング初心者で、Windows7の64bit版でC言語、Java、Objective-Cなどの開発環境を整えたいのですが何かオススメのソフトはありますでしょうか?  正直、「MinGW」などプログラミングの定番ソフトはbeta版だったりなど、Windows7の64bitにはあまり対応していないものが多く困惑しています。  ソフトはなるべくフリーソフトだと助かります。  漠然とした質問で失礼なのですが、回答宜しくお願い致します。 ********************************************************* OS:Windows7 Home Premium 64bit

  • 32bitから64bitのOracleDB移行

    32bit版で構築されているOracleDBを64bit版のOracleDBに移行しようとしているのですが、 下記の問題が生じています。 1)下記のストアド、曜日を取得する変数について、 SELECT TO_CHAR(TO_DATE('2012/02/01'),'Day') INTO v_YOUBI FROM DUAL; 32bit版では、6バイトの定義(v_YOUBI VARCHAR(6))でよかったのですが、 64bit版で、6バイトにすると、オーバーフローになってしまいます。 9バイトにしたところ、正常動作しました。 64bit版で、オーバーフローする理由をお教えください。 ※32bit版、64bit版は共にSHIFT-JISにしております。 2)Date型のテーブル項目にChar型の日付を挿入しようとするとエラーになります(32bit版では許容)。 64bit版では制限が厳しくなったのでしょうか? 32bit版、64bit版の違いをお教えください。 3)ほかに、32bit版から64bit版に移行することによる注意点をお教えください。

  • どなたかパソコンに詳しい方、助けてください。

    どなたかパソコンに詳しい方、助けてください。 いま学校の課題が解けずに困っています。 教科書を見てもよくわかりません。 どなたか次の問題の答えを教えてください。 コンピューターで扱うことのできる文字全体を文字コードと呼び、一般的によく使われるものに(1)コードがある。しかし、(1)では、漢字やひらがなが使えないので(2)コードを用いる。 多くのコンピューターは、アメリカで開発された(3)コードを基本としているが、それ以外に、日本語を表現するのに適した(4)コード、アメリカで開発された2バイトコードであるECU、一文字表現に32ビットを用いる(5)などがある。 選択肢 ア・シフトJIS イ・JIS8ビット ウ・JIS16ビット エ・ユニコード オ・CPU カ・ASCII

  • 32bitで作ったアプリケーションの64bit環境へのコンパイル

    32bitで作ったアプリケーションの64bit環境へのコンパイル 現在、32ビット環境で作ってWindowsXPで正常に動作しているアプリケーションを、 Windows7などの64ビット環境でWOW64を介せずに起動できるように、x64用に コンパイルしようと考えています。 今まではVC++2008EEとWindowsSDK,DirectX9を使って組んでいましたが、 ExpressEditionだとx64向けのコンパイルができないと言うことで、2010EEと WindowsSDK7.1をインストールし、その後構成マネージャで設定をx64にして XP32bit上でコンパイルしました。ソースコードは全く手を加えない状態だったので、 何かエラー・警告があるかと思いましたが、警告も出ずコンパイルは通り、 64ビット環境で起動することも出来ました。 しかし、起動した直後に処理が非常に重くなり、FPSも10~20程度ではないかと 言うほどに動作がもっさりとしてしまいます。 起動しないわけではないし、動き自体も低速ながら、期待されたもしくは XP32bitで起動したときと同じように動いているように見受けられます。 よく見るポインタの長さに関しての問題等も、そもそもあった場合エラーが出て 落ちてしまうのではないかと思います。現状ソースを修正するにしても、 エラーも何も出ていないためどこにどう手を加えたらいいのか分かりません。 なにか原因となるものに心当たりがあればご教授いただけると幸いです。 使用ソフトは上記のようにVC++2008と2010、WinSDK,DirectXともにSDKは (おそらく)最新版でリンクするライブラリのパスにはx64のフォルダを指定、 プリプロセッサの設定で_WIN64を定義しています。 コンパイラも、起動出来てはいるので64ビットのコードを吐くものに 設定されていると思います。