開発Tips/未解決の問題
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*アップキャスト/ダウンキャスト [#c51d7ffd]
キャストしても値が変わらない場合がある。
#code(c){{
int main(int argc, char* argv[])
{
float f;
double d;
f = 0.0;
d = 0.0475;
// d: 0.047500000000000001
f = (float)d; // f: 0.0475000
d = (double)f; // (double)f: 0.047499999403953552
// d: 0.047500000000000001 ...
return 0;
}
}}
-VC6のDebug版で確認
-d→f→d なので無意味なコードと判断され、コンパイル時の最適...
-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.047500000000...
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.047499999403...
00401043 fstp qword ptr [ebp-0Ch]
17: // d: 0.047500000000...
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...
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...
// d→f→d なので無意味なコードと判断され、コンパイル...
return 0;
00411C2A xor eax,eax
}
終了行:
#contents
*アップキャスト/ダウンキャスト [#c51d7ffd]
キャストしても値が変わらない場合がある。
#code(c){{
int main(int argc, char* argv[])
{
float f;
double d;
f = 0.0;
d = 0.0475;
// d: 0.047500000000000001
f = (float)d; // f: 0.0475000
d = (double)f; // (double)f: 0.047499999403953552
// d: 0.047500000000000001 ...
return 0;
}
}}
-VC6のDebug版で確認
-d→f→d なので無意味なコードと判断され、コンパイル時の最適...
-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.047500000000...
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.047499999403...
00401043 fstp qword ptr [ebp-0Ch]
17: // d: 0.047500000000...
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...
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...
// d→f→d なので無意味なコードと判断され、コンパイル...
return 0;
00411C2A xor eax,eax
}
ページ名: