• ベストアンサー

Cの仕様で、確認の方法

C言語の仕様についてですが、文字から、整数に変換する時にビットはどのように変化するか、見たいのですがどうすればよいでしょか?<ctype.h>において、isspaceなどで、char型から、int型のように変換されると書いてあるが、その変化の過程を確認したいです。 気になっているのが、char型で最上位ビットが立っているときに、変換後符号拡張されるのか、それとも正の数になるのかということです。 どのような確認方法がありますでしょうか? まだ初心者の為、質問がわかりにくいと思います。 すみませんが、よろしくお願いします。

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

  • ベストアンサー
  • Largo_sp
  • ベストアンサー率19% (105/538)
回答No.3

プログラム書いてみればいいのでは? char d =0xA1 signed char c = 0xA1; unsigned char uc=0xA1; int i,ic,iuc; main() { i = (int) d; ic = (int) c; iuc = (int) uc; printf("i = %d ,ic = %d , iuc = %d ",i,ic,iuc); } かな? #2のかたの書き方がいいのかな?

2002hare
質問者

お礼

はい、上のような指定方法で理解できました。 ありがとうございました。

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

その他の回答 (4)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.5

char型がsiginedであるかunsignedであるかは環境(処理系実装またはコンパイルオプション)依存です。 char型がunsignedであるときは上位ビットに0が拡張されてint型に変換されます。 char型がsignedであるときは上位ビットは符号拡張されてint型に変換されます。 例外(負の表現が1の補数である場合の-0など)はありますが、一般的な処理系では上記のような変換となります。

2002hare
質問者

お礼

ありがとうございます。

すると、全ての回答が全文表示されます。
回答No.4

すみません、#1です。回答になってないですね。 引用:『プログラミング言語C』付録A6.1 文字、短整数あるいは整数のビット・フィールドは、符号付きも符号なしもすべて、列挙型とともに整数が使える式の中で使ってよい。もしも元の型のすべての値がintで表せるときにはその値はintに変換される。そうでないときにはunsigned intに変換される。この過程を「整数への格上げ」という。 :おわり だそうです。  ところが、文字はunsigned charか、signed charかは実装依存なので、文字の最上位ビットが立っていてもそれが符号を表すかどうかはコンパイラの仕様を調べてみないとわかりません。ただし、印字可能文字はすべて正の範囲に収まるようにという規則はあります。  実際には、コンパイラがはいたコードを逆アセンブルして、アセンブリでどう扱っているかみてみては如何でしょうか?

2002hare
質問者

お礼

教えて頂いたところを調べた所、そうのようになっていました。ありがとうございます。

すると、全ての回答が全文表示されます。
回答No.2

自分でintを受け取る関数を作って、charを与えてみればわかります。下のプログラムでcharのかわりにunsigned char とか signed char を使ってみて比較しましょう。 現実的に多くは符号付きとして扱い、符号拡張されますが、厳密にはコンパイラ依存です。符号の有無に依存しそうなら、明示的にsigned charとかunsigned charを使いましょう。 void foo(int i) { printf("%d\n", i); } int main(void) { char c = 0xff; int i = c; printf("%d\n", i); foo(c); return 0; }

2002hare
質問者

お礼

ありがとうございました、その方法で解決できました。

すると、全ての回答が全文表示されます。
回答No.1

こんにちは。 char型は1バイト。 int型は実装によるが、2バイト以上。 #『プログラミング言語C』第2版44ページより よってchar→int変換で符号ビットが問題になることはない。 と思います。

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

関連するQ&A