C: uint16_t Subtraktionsverhalten in gcc
Ich versuche, zwei vorzeichenlose Ints zu subtrahieren und das Ergebnis mit einem vorzeichenbehafteten Int (oder einem Literal) zu vergleichen. Beim Benutzenunsigned int
gibt das Verhalten wie erwartet ein. Beim Benutzenuint16_t
(vonstdint.h
) Typen das Verhalten ist nicht das, was ich erwarten würde. Der Vergleich wurde mit gcc 4.5 durchgeführt.
Mit folgendem Code:
<code>unsigned int a; unsigned int b; a = 5; b = 20; printf("%u\n", (a-b) < 10); </code>
Die Ausgabe ist 0, was ich erwartet habe. Sowohl a als auch b sind vorzeichenlos, und b ist größer als a, sodass das Ergebnis eine große vorzeichenlose Zahl ist, die größer als 10 ist. Wenn ich nun a und b in uint16_t ändere:
<code>uint16_t a; uint16_t b; a = 5; b = 20; printf("%u\n", (a-b) < 10); </code>
Die Ausgabe ist 1. Warum ist das so? Wird das Ergebnis der Subtraktion zwischen zwei uint16_t-Typen in einem int in gcc gespeichert? Wenn ich das ändere10
zu10U
die Ausgabe ist wieder 0, was dies zu unterstützen scheint (wenn das Subtraktionsergebnis als int gespeichert wird und der Vergleich mit einem vorzeichenlosen int durchgeführt wird, werden die Subtraktionsergebnisse in ein vorzeichenloses int umgewandelt).