2017-01-13 2 views
1

ich ziemlich sicher bin, dass man uint8_t von einem anderen subtrahiert wird in einer anderen Zahl ohne Vorzeichen führen sollte, aber einige meiner Ergebnisse mir verwirren.Gibt es einen Unterschied zwischen unären - und n -

uint8_t a = 2; 
    uint8_t b = 1; 
    uint8_t c = -a; 
    long d = b - a; 
    long e = b + c; 

Wenn ich den Wert von d erreichen, ist es -1, während e produziert, ist, wie ich 255 erwarten würde. Dies ist ein Fehler mit der Version gcc Ich benutze ..... richtig?

Als Referenz verwende ich den arm-none-eabi-g++ Compiler für meine MSP-432.

Blick auf this scheint darauf hinzuweisen, dass gcc scheint nur den gleichen Fehler hier zu machen.

bei this Blick Frage SO es, dass Godbolt scheint und der Arm gcc ist falsch.

Was geht hier vor?

+0

verwendet Konvertierungsspezifizierer von 1. hinzugefügt, bitte? –

+1

In C können Sie nicht mit Typen arbeiten, die kleiner als "int" sind. Suchen Sie nach impliziten Conversions. – Olaf

+2

Integer-Werbeaktionen als Teil von arithmetischen Konvertierungen. Das Ergebnis ist, dass Sie die Größen-Aliase nicht für den Zweck der modularen Arithmetik verwenden können! Die Aliase des Typs codieren den Umsetzungsrang nicht. –

Antwort

6

Dies ist ein Fehler mit der Version von gcc, die ich benutze ..... richtig?

Nein, ist es nicht. Etwas, das einfach in einem großen Compiler wie gcc fehlerhaft ist, ist höchst unwahrscheinlich.

Was den „üblichen arithmetischen Umwandlungen“ ist aufgrund der Fall ist, spezifisch „integer promotion“:

unären - fördert a zu int, dann ist die (int)-2 zurück zu uint8_t in der Zuordnung umgewandelt wird, wodurch man c == 254 (die ist der Repräsentant der Äquivalenzklasse von -2 in Z mod 2^8, die in [0, 2^8) liegt.

Ebenso die binären + und - in den Leitungen unter dem zu int fördern, so dass wir am Ende mit

d == (int)b - (int)a == (int)1 - (int)2 == -1 

und

e == (int)b + (int)c == (int)1 + (int)254 == 255 

So funktioniert alles von der Norm als Mandated Fein .

2

Der Grund dafür ist, dass Binäroperatoren integrale Förderung unterziehen, bevor die Arbeit zu tun, und da int alle möglichen Werte von uint8_t halten kann, wird diese Wahl verwendet wird (siehe http://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion). Daher wird die Subtraktion als eine vorzeichenbehaftete Operation durchgeführt. Wert in c Speicherung bereits in Folge Ihre erwartete Modulo Mathe

Wenn e der Akt der Berechnung 254 zu speichern, die auf b ‚s-Wert wird dann

Verwandte Themen