uint8_t a = 0x1234;
Will a == 34
? Ist dies, weil 0x34
ist das erste Byte?
Wenn ja, wie führe ich Prüfungen durch, um sicherzustellen, dass der Wert, den ich der a
nicht die Größe von uint8_t
?
uint8_t a = 0x1234;
Will a == 34
? Ist dies, weil 0x34
ist das erste Byte?
Wenn ja, wie führe ich Prüfungen durch, um sicherzustellen, dass der Wert, den ich der a
nicht die Größe von uint8_t
?
jslagle@AR-E642-45QS3R1:~ $ cat test.c
#include <stdio.h>
#include <inttypes.h>
int main (int argc, char **argv) {
uint8_t a = 0x1234;
printf("%d %x\n",a,a);
return 0;
}
jslagle@AR-E642-45QS3R1:~ $ gcc -o test test.c
test.c: In function ‘main’:
test.c:5:3: warning: large integer implicitly truncated to unsigned type [-Woverflow]
jslagle@AR-E642-45QS3R1:~ $ ./test
52 34
Es verhält sich in der Tat so. GCC gibt Ihnen eine Warnung, wenn Sie es tun.
In diesem Fall nimmt a den Wert 34? an, denn [34] ist das erste Byte?
Nicht ganz. Wenn Sie sich die Zahl im Hex-Format ansehen, könnte es so aussehen. Aber wenn Sie die Zahl dezimal betrachten, ist 0x1234 = 4660 (dezimal). In dem Beispielprogramm von @user1061077 oben wird der Wert wie folgt gespeichert 52
das ist 4660 % 256
d.h. der Rest der Zahl bei Division durch 256
. Warum 256
? Denn in einem 8-Bit-Speicher können nur Werte von 0 bis 255
(gesamt 256
Zahlen). Wenn Sie einen Wert zuweisen, der größer ist als 256
, dann wird die Zahl umgedreht und schließlich der Rest gespeichert. Wenn Sie also versuchen, Folgendes zu speichern 256
anstelle von 4660
wird der resultierende Wert sein 0
. Bei größeren Zahlen entspricht die Anzahl der Überschläge also genau dem Quotienten der Division: number-to-be-stored / total-number-of-numbers
. In Ihrem Fall ist es der Quotient aus 4660/256
.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.