回答編集履歴
2
誤字脱字を修正
test
CHANGED
@@ -42,13 +42,13 @@
|
|
42
42
|
|
43
43
|
|
44
44
|
|
45
|
-
このように、一見不可解に見える動
|
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進数で表示する方法を追記
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が、**リトルエンディアン**でメモリをアクセスするからです。
|