概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C 変換型とキャスト
2006年10月09日 (月) | 編集 |
セロリ入れすぎてコンソメスープがセロリスープっぽくなってしまった。
まあ味は悪くないのが救いか(少し薄いが)。
香り出るのはいいんだが、多すぎてもあかんということかね。
前はレモン汁入れすぎてやけに酸味が強いスープになったりしたし…

まさに過ぎたるは及ばざるが如し。

やはり味付けはそれなりに繊細に行わないといかんな。
適当に大雑把でも上手くいくというのは経験があってこそ為せる業なのだ、きっと。



…ていうか何で俺が飯作ってるんですかね?

あるデータ型を他のデータ型に変換する規則や、型変換を行うキャストの話だ。
キャストは前に一度出てきたな。


混合変換と型変換

例えば'a'+5のように、文字型である'a'と整数型である5といった異なる型同士の演算を混合演算と言うそうな。
C言語では文字型、整数型、実数型の間では混合演算を認めており、その際には
  • charunsigned charshortint
  • unsigned shortunsigned int
  • floatdouble

それぞれ変換され、その後更に

long double>double>unsigned long>long>unsigned int>int

の優先度で型の高い方に変換されて演算されるらしい。
最終的には細かい方の数値に合わせて計算されるってことかね?
unsigned辺りがよく分からんけど。

このことは関数の引数の場合についても同じで、関数を呼び出した場合、実引数の値はスタックというメモリに積まれ、関数の仮引数に渡されるんだが、その際にも上記の規則に従って、intunsigned intlongunsigned longdoubleなんかに変換されて渡されるのだそうだ。
上記の規則にはlongとかないので、longはそのまま渡されるということなのだろう。
で、後はint>unsigned int>long>中略>doubleの順に積まれていく、と。


ゼロ拡張と符号拡張

符号無し数(unsignedってやつだな)を高い型(サイズの大きい型)に変換する際、拡張される上位ビットに0を埋める方法をゼロ拡張というのだそうだ。なんのこっちゃ。
この方法は符号無し数の値をそのまま保持するのに役立つらしい。

例えば
unsigned char a=0x80;
1000 0000(10進数に直すと128)


unsigned int b;
b=a;にしたとき、

0000 0000 1000 0000(桁が増えてもやっぱり10進数で128)
  ↑
この0を8つ埋めた部分がゼロ拡張らしい
確かに値は変わっていない。分かったような分からんような。


これに対し、符号有りの数を高い型(サイズの大きい型)に変換する際に拡張される上位ビットに符号ビットを生める方法を符号拡張という。
この方法は符号付き数の値をそのまま保持するのに役立つのだそうだ。

例えば
char a=0x80;
1000 0000(符号有りだと最上位のビットが1だと負の数を意味するので-128に)


int b;
b=a;にしたとき、

1111 1111 1000 0000(1が沢山増えてるが一応-128のまま)
  ↑
この1を8つ埋めた部分が符号拡張らしい。
符号付き数は最上位ビットで負か正かを決めるのでこの場合は1が埋められたんだろう。


キャスト

C言語における型変換規則は厳格でないらしく、型変換において曖昧さが生じる危険があるらしい。
そこでキャストと呼ばれる演算子を使って、オブジェクトの型をそれが評価される時だけ一時的に変えることにして、型変換における厳格さを保とうとしたりするのだそうだ。

例えば、次のように引数がdouble型の関数があったとして、

sqrt(10);
sprt(double x)
{
 略
}


とすると10は整数型なので型が不一致になり、結果が保障されなくなってしまうらしく、型を一致させる為にsqrt(10.0)とでもすべきなんだが、このときsqrt(i)とでもしてあって、iがint型だったりする場合には迂闊に.0をつける訳にもいかない。

こんなときにキャストを使って、

sqrt((double)i);

として、iの型を一時的にdouble型とすれば問題なく渡せるわけなのである。
キャストは一般的に、

(型)

のように( )の中に型(charint…double*structunion等)を記述する。
この場合の型はキャスト演算子と呼ばれるらしいな。



以上。
うむ、まとめようが無い。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。