Was macht dieser Code?

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)

1

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.

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.

0

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

0
@micholee

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.

0

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?

0

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?

1
@micholee

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.

0
@kmkcl

interessant, warum beim prüfen, also bei if(...) automatisch ein CAST gemacht wird. Wenn man das nicht weiß, liegen hier wohl sehr viele mögliche Fehlerquellen. Da wäre ich nie auf die Idee gekommen, das gecastet wird.

0