準・究極の選択

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

A 回答 (5件)

プログラム書いてみればいいのでは?



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のかたの書き方がいいのかな?
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/07/30 11:54

char型がsiginedであるかunsignedであるかは環境(処理系実装またはコンパイルオプション)依存です。



char型がunsignedであるときは上位ビットに0が拡張されてint型に変換されます。

char型がsignedであるときは上位ビットは符号拡張されてint型に変換されます。

例外(負の表現が1の補数である場合の-0など)はありますが、一般的な処理系では上記のような変換となります。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2003/07/30 11:56

すみません、#1です。

回答になってないですね。

引用:『プログラミング言語C』付録A6.1
文字、短整数あるいは整数のビット・フィールドは、符号付きも符号なしもすべて、列挙型とともに整数が使える式の中で使ってよい。もしも元の型のすべての値がintで表せるときにはその値はintに変換される。そうでないときにはunsigned intに変換される。この過程を「整数への格上げ」という。
:おわり

だそうです。
 ところが、文字はunsigned charか、signed charかは実装依存なので、文字の最上位ビットが立っていてもそれが符号を表すかどうかはコンパイラの仕様を調べてみないとわかりません。ただし、印字可能文字はすべて正の範囲に収まるようにという規則はあります。

 実際には、コンパイラがはいたコードを逆アセンブルして、アセンブリでどう扱っているかみてみては如何でしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/07/30 11:55

自分で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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/07/30 11:53

こんにちは。



char型は1バイト。
int型は実装によるが、2バイト以上。
#『プログラミング言語C』第2版44ページより

よってchar→int変換で符号ビットが問題になることはない。

と思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!