#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 
 }


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS