3 Stimmen

Zuweisung eines Hex-Wertes zu einem Char

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 ?

3voto

jslagle Punkte 81

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.

0voto

yasouser Punkte 4981

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.com

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.

Powered by:

X