回答編集履歴

2

誤字脱字を修正

2017/07/21 02:07

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -42,13 +42,13 @@
42
42
 
43
43
 
44
44
 
45
- このように、一見不可解に見える動作・表示は、**データがどのような形でメモリに格納されているか**、メモリ上の2進数値を調べると解決することが多くあります。
45
+ このように、一見不可解に見える動は、**データがどのような形でメモリに格納されているか**、メモリ上の2進数値を調べると解決することが多くあります。
46
46
 
47
47
 
48
48
 
49
49
  明示的キャスト・暗黙的キャストについて。
50
50
 
51
- 型の異なるもの同士の代入、例えば test = pi; のような場合は、コンパイラが気を効かせて(笑)、型変換の処理をしてから代入してくれます。明示的なキャストをすれば、勿論そこに必要な型変換処理をしてくれます。
51
+ 型の異なるもの同士の代入など、例えば test = pi; のような場合は、コンパイラが気を効かせて(笑)、型変換の処理をしてから代入してくれます。明示的なキャストをすれば、勿論そこに必要な型変換処理をしてくれます。
52
52
 
53
53
 
54
54
 

1

浮動小数点数を16進数で表示する方法を追記

2017/07/21 02:07

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -48,10 +48,40 @@
48
48
 
49
49
  明示的キャスト・暗黙的キャストについて。
50
50
 
51
- 型の異なるもの同士の代入、例えば test = pi; のような場合は、コンパイラが気を効かせて(笑)型変換の処理をしてから代入してくれます。明示的なキャストをすれば、勿論そこに必要な型変換処理をしてくれます。
51
+ 型の異なるもの同士の代入、例えば test = pi; のような場合は、コンパイラが気を効かせて(笑)型変換の処理をしてから代入してくれます。明示的なキャストをすれば、勿論そこに必要な型変換処理をしてくれます。
52
52
 
53
53
 
54
54
 
55
55
  しかし、「メモリの内容を出力する」printf() に渡される引数が、暗黙的にキャストされることはありません。 ```printf("pi=3.14を整数型で出力\t%d\n", (int)pi);```の場合は、浮動小数点数を整数に変換した結果(即ち 0x00000003)が printf() に渡り、3 と表示されます。
56
56
 
57
57
  こうした事は、コンパイル結果をアセンブリコードで確認すると明確になります。
58
+
59
+
60
+
61
+ 追記:浮動小数点数が、どのような2進数になるのか、unionな変数を使うと容易に確認できます。
62
+
63
+ ```C
64
+
65
+ union {
66
+
67
+ double dval;
68
+
69
+ int ival[2];
70
+
71
+ } upi;
72
+
73
+
74
+
75
+ upi.dval = 3.14;
76
+
77
+ printf("dvalを16進数で表示\t%x %x\n", upi.ival[1], upi.ival[0]);
78
+
79
+ ```
80
+
81
+ 実行結果です。
82
+
83
+ ```dvalを16進数で表示 40091eb8 51eb851f```
84
+
85
+
86
+
87
+ 念の為:```printf("%x %x\n", upi.ival[1], upi.ival[0]);```という順序で表示する理由は、私達が使うパソコンのCPUが、**リトルエンディアン**でメモリをアクセスするからです。