#author("2018-05-26T13:19:46+09:00","default:mat2umoto","mat2umoto") #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 ←0.047499999403953552に変わらない。元のまま。 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 }