webentwicklung-frage-antwort-db.com.de

Wie drucke ich 1 Byte mit printf?

Ich weiß, dass wir bei Verwendung von %x mit printf() 4 Bytes (eine int in hexadezimaler Schreibweise) vom Stapel drucken. Ich möchte aber nur 1 Byte drucken. Gibt es eine Möglichkeit, dies zu tun?

2
ahg8tOPk78

Annahme: Sie möchten den Wert einer Variablen mit einer Breite von 1 Byte drucken, d. H. char.

Wenn Sie eine Variable char haben, sagen Sie char x = 0; und möchten den Wert drucken, verwenden Sie %hhx Formatbezeichner mit printf().

So etwas wie

 printf("%hhx", x);

Andernfalls kann aufgrund einer Standardargumentweiterung eine Anweisung wie

  printf("%x", x);

wäre auch korrekt, da printf() die sizeof(unsigned int) nicht aus stack liest, der Wert von x wird basierend auf seinem Typ gelesen und der Wert wird auf jeden Fall zum erforderlichen Typ heraufgestuft.

8
Sourav Ghosh

Sie müssen vorsichtig sein, wie Sie dies tun, um undefined Verhalten zu vermeiden.

Mit dem C-Standard können Sie die int in einen unsigned char umwandeln und dann das gewünschte Byte mit Pointer-Arithmetik drucken:

int main()
{
    int foo = 2;
    unsigned char* p = (unsigned char*)&foo;
    printf("%x", p[0]); // outputs the first byte of `foo`
    printf("%x", p[1]); // outputs the second byte of `foo`
}

Beachten Sie, dass p[0] und p[1] vor der Anzeige der Ausgabe in den breiteren Typ (die int) konvertiert werden.

4
Bathsheba

Sie können die folgende Lösung verwenden, um ein Byte mit printf zu drucken:

unsigned char c = 255;
printf("Unsigned char: %hhu\n", c);
1
macario

Wenn Sie ein einzelnes Byte drucken möchten, das in einem größeren Werttyp vorhanden ist, können Sie den erforderlichen Wert maskieren und/oder herausschieben (z. B. int x = 0x12345678; x & 0x00FF0000 >> 16). Oder rufen Sie einfach das erforderliche Byte ab, indem Sie die benötigte Byteposition mit einem (unsigned) Zeichenzeiger umwandeln und einen Offset verwenden.

0
Ton Plooij