Vorzeichenbehaftete Ganzzahlen in C stehen für Zahlen. Wenn a
und b
Variablen von vorzeichenbehafteten Ganzzahltypen sind, verlangt der Standard niemals, dass ein Compiler den Ausdrucksspeicher a+=b
in a
etwas anderes als die arithmetische Summe ihrer jeweiligen Werte umwandelt. Wenn die arithmetische Summe nicht passen würde a
, könnte der Prozessor sie möglicherweise nicht dort ablegen, aber der Standard würde nicht erfordern, dass der Compiler den Wert abschneidet oder umschließt oder irgendetwas anderes tut, wenn die Werte überschritten werden die Grenzen für ihre Typen. Beachten Sie, dass C-Implementierungen arithmetische Überläufe mit vorzeichenbehafteten Werten abfangen dürfen, obwohl der Standard dies nicht erfordert.
Ganzzahlen ohne Vorzeichen in C verhalten sich wie abstrakte algebraische Ringe von Ganzzahlen, die kongruent modulo mit einer Zweierpotenz sind, außer in Szenarien, die Konvertierungen in oder Operationen mit größeren Typen beinhalten. Das Konvertieren einer Ganzzahl beliebiger Größe in einen 32-Bit-Typ ohne Vorzeichen ergibt das Element, das den Dingen entspricht, die mit dieser Ganzzahl mod 4,294,967,296 kongruent sind. Der Grund für das Subtrahieren von 3 von 2 ergibt 4.294.967.295, dass das Hinzufügen von etwas Kongruentem zu 3 zu etwas Kongruentem zu 4.294.967.295 etwas Kongruentes zu 2 ergibt.
Abstrakte algebraische Ringtypen sind oft praktisch; Leider verwendet C die Vorzeichen als entscheidenden Faktor dafür, ob sich ein Typ als Ring verhalten soll. Schlimmer noch, vorzeichenlose Werte werden bei der Konvertierung in größere Typen eher als Zahlen als als Ringelemente behandelt, und vorzeichenlose Werte, die kleiner sind als int
die Umwandlung in Zahlen, wenn eine Arithmetik für sie ausgeführt wird. Wenn v
a uint32_t
gleich ist 4,294,967,294
, dann v*=v;
sollte machen v=4
. Wenn int
es sich um 64 Bit handelt, ist leider nicht abzusehen, was v*=v;
dies tun könnte.
In Anbetracht des Standards würde ich vorschlagen, vorzeichenlose Typen in Situationen zu verwenden, in denen das mit algebraischen Ringen verbundene Verhalten gewünscht wird, und vorzeichenbehaftete Typen, wenn Zahlen dargestellt werden sollen. Es ist bedauerlich, dass C die Unterscheidungen so getroffen hat, aber sie sind das, was sie sind.