2017-03-23 39 views
0

我有以下代碼: 「OK!」優化器錯誤或未定義的行爲?

#include <math.h> 
#include <stdio.h> 

using u16 = unsigned short int; 
using s16 = signed short int; 
using s32 = signed int; 

s16 Algorithm(s16 sample) 
{ 
    s32 absSample = static_cast<s32>(abs(sample)); 
    s32 sampleBits = absSample >> 7; 
    s32 sampleMasked = absSample & 0x7F; 

    s16 result = (u16)(sampleMasked << sampleBits) | (u16)(1 << (sampleBits - 2)); 
    if (sample < 0) 
    { 
     result = -result; 
    } 
    return result; 
} 

int main() 
{ 
    s16 result = Algorithm(-63); 
    if (result == -63) 
    { 
     printf("OK!\n"); 
     return 0; 
    } 
    else 
    { 
     printf("BUG!?\n"); 
     return 1; 
    } 
} 

在64位調試它打印但在x64發行版中,它會打印出「BUG !?」,我的代碼有問題,或者編譯器在這裏做錯了什麼?我如何解決或解決此問題?

+0

只是確保,你有更新3修補程序(假設你使用MSVC 2015)? – user975989

+0

我目前正在更新2,這是更新3中的某些內容嗎? – paulm

+0

我不太確定,我只是認爲這可能是相關的。 – user975989

回答

4

由於價值-63觸發未定義行爲(sampleBits爲0這樣你會被轉移-2的地方),一切皆有可能:)

+0

添加了一個檢查,以便將移位值限制爲0,並且現在都生成正確的值 – paulm

相關問題