アップキャスト/ダウンキャスト †
キャストしても値が変わらない場合がある。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| | int main(int argc, char* argv[])
{
float f;
double d;
f = 0.0;
d = 0.0475;
f = (float)d; d = (double)f;
return 0;
}
|
- VC6のDebug版で確認
- d→f→d なので無意味なコードと判断され、コンパイル時の最適化で消されている?(Debug版は最適化無効になっているが)
- VC2003のDebug版では発生せず
- volatileをつけても発生するか要確認
- VC6の混合モード
6: int main(int argc, char* argv[])
7: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,4Ch
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-4Ch]
0040101C mov ecx,13h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
8: float f;
9: double d;
10:
11: f = 0.0;
00401028 mov dword ptr [ebp-4],0
12: d = 0.0475;
0040102F mov dword ptr [ebp-0Ch],851EB852h
00401036 mov dword ptr [ebp-8],3FA851EBh
13:
14: // d: 0.047500000000000001
15: f = (float)d; // f: 0.0475000
0040103D fld qword ptr [ebp-0Ch]
00401040 fst dword ptr [ebp-4]
16: d = (double)f; // (double)f: 0.047499999403953552
00401043 fstp qword ptr [ebp-0Ch]
17: // d: 0.047500000000000001 ←0.047499999403953552に変わらない。元のまま。
18:
19: return 0;
00401046 xor eax,eax
20: }
- VC2003の混合モード
int _tmain(int argc, _TCHAR* argv[])
{
00411BF0 push ebp
00411BF1 mov ebp,esp
00411BF3 sub esp,0DCh
00411BF9 push ebx
00411BFA push esi
00411BFB push edi
00411BFC lea edi,[ebp-0DCh]
00411C02 mov ecx,37h
00411C07 mov eax,0CCCCCCCCh
00411C0C rep stos dword ptr [edi]
float f;
double d;
f = 0.0;
00411C0E mov dword ptr [f],0
d = 0.0475;
00411C15 fld qword ptr [__real@3fa851eb851eb852 (4280C8h)]
00411C1B fstp qword ptr [d]
// d: 0.047500000000000001
f = (float)d; // f: 0.0475000
00411C1E fld qword ptr [d]
00411C21 fstp dword ptr [f]
d = (double)f; // (double)f: 0.047499999403953552
00411C24 fld dword ptr [f]
00411C27 fstp qword ptr [d]
// d: 0.047500000000000001 ←0.047499999403953552に変わらない。元のまま。
// d→f→d なので無意味なコードと判断され、コンパイル時の最適化で消されている?
return 0;
00411C2A xor eax,eax
}
|