2017-03-23 10 views
0

私は、次のコードを持っている:それは印刷さx64のデバッグでオプティマイザのバグまたは未定義の動作ですか?

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

を "OK!"しかし、x64リリースでは "BUG !?"という文字が印刷されています。私のコードに問題がありますか、ここで何か間違っているのですか?この問題を解決するにはどうすればよいですか?

+0

ちょうど(あなたが使用していると仮定してください、あなたはアップデート3用の修正プログラムを持っています作る:)発生する可能性がありますMSVC 2015)? – user975989

+0

私は現在アップデート2に入っていますが、これはアップデート3で修正されていますか? – paulm

+0

私はあまり確信していません、私はちょうどそれが関連するかもしれないと思った。 – user975989

答えて

4

-63が未定義の動作をトリガーするので(sampleBitsは、このようにあなたが-2場所をシフトされます0になります)何が

+0

シフト値が0に制限され、両方が正しい値を生成するようにチェックが追加されました – paulm

関連する問題