Large Display Size Middle Display Size Small Display Size
概要 キーワード 著者

共用体でやっていることは
型キャストでやっていることと
同じ?

2016/04/27(水)

この文書は、私用のメモを訪問者の皆さん向けに言葉を直した文書です。

私が最近面白いと思っていることなので、掲載したいと思います。

変数がメモリーのなかでどのように保存されているか、というのは私はとても大切なことだと思っています。なぜそう思うのかは正直言ってあまり考えたことはありません。ただ将来、そういう知識やメモリの内容を16進で表示する操作が必要な場面がありうると思うんです。それで意図的にメモリの内容をさぐる練習をしています。スポーツマンが腕立て伏せをするようなもので、そんなに特別なことではないと考えられますが…、内部を探るのが楽しい人っていますか?

共用体と型キャストは同じことをしている?

C言語の「共用体」について本で勉強していると、『では型キャストと同じではないか?』とふと思います。

しかし、先に結論を言ってしまうと、同じではありません。

参考URL: http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1052443530

共用体は、そのメモリのビットの並びをfloatとして見るか、intとしてみるかを切り替えるものです。見方を変えるだけです。

対して、型キャストは、見方だけではなく、データを実際に変換する処理を行います。


共用体の動きを見る

共用体として宣言した変数のメモリのビットの並びは、最初にこのようになっているとします。

00 00 20 41

(この例はWindows(Intelプロセッサ)なので、本来 41 20 00 00 になるところ、リトルエンディアンでバイトごとに逆順に並んでいます)

リトルエンディアン: 人間にとってのバイトの並びを逆順にメモリに配置する考え方

バイトごと: 1バイトとは FF みたいな16進数値です。この文字2つずつということです。

これを共用体内で宣言されたfloat変数で見て、printfで10進値として表示すると、

(float変数で見る: 共用体は1か所のメモリに対して複数の変数宣言を持っているようなもの)

10.000000 (これは浮動小数点表示にすると 41 20 00 00)

になりますが、共用体内で宣言されたint変数で見て、printfで10進値として表示すると、

1092616192 (これは16進で 41 20 00 00)

になります。ビットの並びは変わっていません。


次に型キャストの動きを見る (int変数をfloat変数へキャストして代入する)

整数123のキャスト前のメモリのビットの並びは

7b 00 00 00 (7bは10進で123)

浮動小数点へのキャスト後は

00 00 f6 42 (浮動小数点表記の42f60000は10進に直すと123)

ビットは明らかに異なっています。(意味する数値は維持されている)


以上のように、共用体ではビットの並びを変えませんが、キャストはビットの並びを変えています。

みなさんのC言語の知識のお役に立てばと思います。

ページ制作 homepage6047


ページの上端へ (もくじ開く)