2017-03-23 2 views
0

Ich habe den folgenden Code: "OK"Optimierungsfehler oder undefiniertes Verhalten?

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

In x64 Debug druckt es aber in der x64-Version gibt es "BUG !?" aus, gibt es ein Problem mit meinem Code oder macht der Compiler hier etwas falsch? Wie kann ich dieses Problem beheben oder umgehen?

+0

nur sicherstellen, dass, müssen Sie den Hotfix für Update 3 (vorausgesetzt, Sie verwenden MSVC 2015)? – user975989

+0

Ich bin gerade auf Update 2, ist das etwas in Update 3 behoben? – paulm

+0

Ich bin mir nicht sicher, ich dachte nur, dass es relevant sein könnte. – user975989

Antwort

4

Da der Wert -63 undefinierten Verhalten auslöst (sampleBits wird 0 so werden Sie -2 Orte verlagern) alles passieren kann :)

+0

Eine Überprüfung hinzugefügt, so dass der Verschiebungswert auf 0 begrenzt ist und beide jetzt den korrekten Wert erzeugen – paulm

Verwandte Themen