アップキャスト/ダウンキャスト Edit

キャストしても値が変わらない場合がある。

  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;
 
                    // 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
Last-modified: 2018-05-26 (土) 13:19:46 (2179d)