Was macht dieser Code?
Siehe Foto:
4 Antworten
Naja, ist eigentlich ganz einfach. Wenn uintA - uintB größer oder gleich als 0 ist werden zwei Nachrichten ausgegeben (die ersten 2 printf statements), wenn kleiner als 0 werden die anderen zwei Nachrichten ausgegeben. (die letzten 2 printf statements)
Danke. Da ich den code nicht simulieren kann, (weiß nicht, ob das mit normalen windows 11 bordmitteln geht), wusste ich nicht, welche der beiden Ausgaben zutrifft, ob IF doer das Else zutrifft, da hier von 3 eine 4 abgezogen wird, aber die zahl ist ja als "unsigned" deklariert (also keine negativen-zahlen möglich)
Er prüft, ob uintA größer oder gleich uintB ist, denn nur dann ist uintA - uintB >= 0.
uintC ist immer > 0 wenn uintA != uintB. Wenn uintA == uintB, dann ist uintC == 0.
Die Subtraktion in der Klammer wird aber implizit nach int gecastet und kann somit negative Werte annehmen, wenn uintB > uintA.
Es findet ein numeric overflow statt. 0 - 1 = 255, 0 - 2 = 254, 0 - 3 = 253 und so weiter. Das passiert, weil durch die Angabe des Typs von uintC festgelegt wird, dass das Ergebnis ein unsigned char (also ein byte mit Werten von 0 - 255) sein soll.
Hatte ich auch erst gedacht, aber die zweite Subtraktion wird zu einem signed Integer evaluiert, während uintC ein unsigned integer (nicht vorzeichenbehaftet) ist.
if (uintC >= 0)
gilt dann immer, egal welchen Wert uintC annimmt.
Es wird geprüft, ob uintA größer als uintB ist. Ist dem so, dann ist uintC = uintA-uintB. Ansonsten (condition is FALSE) gilt die Gleichheit nicht, da uintC unsigned ist.
Wie würde aber uintC umgehen, wenn dies als "unsigned" deklariert ist, aber von 3 eine 4 abgezogen wird?
uintC ist 255 und somit >=0.
Wie kommt er auf 255? liegt es daran, dass von 3 eine 4 abgezogen wird? Sprich, wenn Char = 256 ist, also von 0 bis 255. Und zieht man von 3 nun 4 ab, dann beginnt es von hinten, also ist man bei 255?
Der Prozessor rechnet intern immer in Zweierkomplementdarstellung. Das Ergebnis von 3-4 ist -1 und bei -1 in Zweierkomplementdarstellung sind alle Bits 1. Da wir hier eine 8-bit breite Zahl haben, ist das Ergebnis 0xFF, was als nicht-vorzeichenbehafteter Zahl 255 entspricht.
Es gibt übrigens verschiedene Internetseiten, um C-Code online zu testen. Eine ist: https://www.onlinegdb.com/online_c_compiler
Die Bedingung ist etwas komplizierter, das hatte ich zuerst übersehen... Bei if(uintA-uintB >=0) wird vor der Überprüfung ein automatischer Cast zu signed integer gemacht, bzw. in Wirklichkeit wird geprüft, ob die Zahl negativ ist, indem das höchste Bit geprüft wird... Daher ist uintA-uintB = -1 und somit kleiner als 0.
Hab gerade noch mal geschaut... Die Lösung zu den Casts scheint doch komplexer, als ich dachte. ;)
https://stackoverflow.com/questions/17832815/c-implicit-conversion-signed-unsigned
Hier gilt vermutlich, dass 0 ein int ist und somit der größere Datentyp in Vergleich zu char...
Alle variablen uintA, uintB, uintC sind ja als "unisgned" deklariert. Dann wird aber von unintA (3) eine größere Zahl uintB (4) abgezogen.
Wie geht dann aber uintC damit um, da ja keine Minuszahl möglich ist, da "unsigned". Ich sehe nirgends ein Cast