C言語の仕様についてですが、文字から、整数に変換する時にビットはどのように変化するか、見たいのですがどうすればよいでしょか?<ctype.h>において、isspaceなどで、char型から、int型のように変換されると書いてあるが、その変化の過程を確認したいです。
気になっているのが、char型で最上位ビットが立っているときに、変換後符号拡張されるのか、それとも正の数になるのかということです。
どのような確認方法がありますでしょうか?
まだ初心者の為、質問がわかりにくいと思います。
すみませんが、よろしくお願いします。
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のかたの書き方がいいのかな?
No.4
- 回答日時:
すみません、#1です。
回答になってないですね。引用:『プログラミング言語C』付録A6.1
文字、短整数あるいは整数のビット・フィールドは、符号付きも符号なしもすべて、列挙型とともに整数が使える式の中で使ってよい。もしも元の型のすべての値がintで表せるときにはその値はintに変換される。そうでないときにはunsigned intに変換される。この過程を「整数への格上げ」という。
:おわり
だそうです。
ところが、文字はunsigned charか、signed charかは実装依存なので、文字の最上位ビットが立っていてもそれが符号を表すかどうかはコンパイラの仕様を調べてみないとわかりません。ただし、印字可能文字はすべて正の範囲に収まるようにという規則はあります。
実際には、コンパイラがはいたコードを逆アセンブルして、アセンブリでどう扱っているかみてみては如何でしょうか?
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;
}
No.1
- 回答日時:
こんにちは。
char型は1バイト。
int型は実装によるが、2バイト以上。
#『プログラミング言語C』第2版44ページより
よってchar→int変換で符号ビットが問題になることはない。
と思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#からC言語で作成したDLLに文...
-
ftoa の作り方
-
-'0'の意味について
-
charからLPTSTRへの変換方法
-
fgetsなどのときのstdinのバッ...
-
プログラミング(関数reverseを...
-
str系関数を使わずに二つの文字...
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
double型の値をchar配列に変換...
-
”あいうえお” を ”おえういあ...
-
バイナリファイルをコピーする...
-
入力された文字列から整数だけ...
-
絶対パスからのファイル名の切...
-
配列をnビットシフトする
-
Win32APIでのエディットボック...
-
C言語のfor文です。 繰り返しの...
-
'const char *' 型は 'char *' ...
-
構造体の各メンバにfor文からア...
-
C言語 バイナリファイルをfloa...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
CStringをwchar_tに変換したい
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
配列をnビットシフトする
-
半角カナ→16進
-
double型の値をchar配列に変換...
-
sprintfに同じ変数は使えるか
-
ファイル名である文字列からbas...
-
ネットワークにつながっている...
-
ftoa の作り方
-
間接操作のレベルとは
-
型変換
-
C言語です
-
C言語のfor文です。 繰り返しの...
-
Win32APIでのエディットボック...
-
【C言語】文字型と整数型の違い
おすすめ情報