Wie drucke ich den Wert der Variablen uint32_t und uint16_t?

Lesezeit: 4 Minuten

Benutzeravatar von xrcwrn
xrcwrn

Ich versuche, einen uint16_t- und einen uint32_t-Wert zu drucken, aber es gibt nicht die gewünschte Ausgabe.

#include <stdio.h>
#include <netinet/in.h>

int main()
{
    uint32_t a = 12, a1;
    uint16_t b = 1, b1;
    a1 = htonl(a);
    printf("%d---------%d", a1);
    b1 = htons(b);
    printf("\n%d-----%d", b, b1);
    return 0;
}

habe ich auch benutzt

 printf("%"PRIu32, a);

die einen Fehler anzeigt.

Wie drucke ich diese Werte und was wird die gewünschte Ausgabe sein?

  • Es wäre viel hilfreicher, uns die (genaue!) Fehlermeldung zu zeigen, anstatt nur zu sagen, dass es “Fehler anzeigt”. Und anstatt nur “das gewünschte o / p nicht zu geben”, zeigen Sie uns die tatsächliche Ausgabe (und buchstabieren Sie das Wort “output”, anstatt “o / p” zu schreiben).

    – Keith Thompson

    25. August 2012 um 8:59 Uhr


  • printf("%d---------%d",a1); führt zu undefiniertem Verhalten, da Sie zwei %d in der Formatzeichenfolge haben, aber nur einen Parameter übergeben.

    – Jerry Jeremia

    6. August 2018 um 5:11 Uhr

  • Mögliches Duplikat von Formatbezeichnern für uint8_t, uint16_t, …?

    – phuklv

    30. April 2019 um 3:57 Uhr

Benutzeravatar von paxdiablo
paxdiablo

Sie müssen einschließen inttypes.h wenn Sie all diese raffinierten neuen Formatbezeichner für die intN_t Typen und ihre Brüder, und das ist der richtige (dh portable) Weg, dies zu tun, vorausgesetzt, Ihr Compiler entspricht C99. Sie sollten nicht die Standardtypen wie verwenden %d oder %u falls die Größen anders sind als Sie denken.

Es enthält stdint.h und erweitert es um einige andere Dinge, wie zum Beispiel die Makros, die für die verwendet werden können printf/scanf Familie der Anrufe. Dies wird in Abschnitt 7.8 des ISO C99-Standards behandelt.

Zum Beispiel das folgende Programm:

#include <stdio.h>
#include <inttypes.h>
int main (void) {
    uint32_t a=1234;
    uint16_t b=5678;
    printf("%" PRIu32 "\n",a);
    printf("%" PRIu16 "\n",b);
    return 0;
}

Ausgänge:

1234
5678

Benutzeravatar von Keith Thompson
Keith Thompson

Die Makros definiert in <inttypes.h> sind die korrekteste Art, Werte von Typen zu drucken uint32_t, uint16_tund so weiter – aber sie sind nicht der einzige Weg.

Ich persönlich finde diese Makros schwer zu merken und umständlich zu verwenden. (Angesichts der Syntax von a printf Format-String, das ist wahrscheinlich unvermeidlich; Ich behaupte nicht, dass ich mir ein besseres System hätte einfallen lassen können.)

Eine Alternative besteht darin, die Werte in einen vordefinierten Typ umzuwandeln und das Format für diesen Typ zu verwenden.

Typen int und unsigned int wird von der Sprache garantiert, dass sie mindestens 16 Bit breit sind und daher jeden konvertierten Wert des Typs aufnehmen können int16_t oder uint16_t, beziehungsweise. Ähnlich, long und unsigned long mindestens 32 Bit breit sind, und long long und unsigned long long mindestens 64 Bit breit sind.

Zum Beispiel könnte ich Ihr Programm so schreiben (mit ein paar zusätzlichen Optimierungen):

#include <stdio.h>
#include <stdint.h>
#include <netinet/in.h>  

int main(void)
{
    uint32_t a=12, a1;
    uint16_t b=1, b1;
    a1 = htonl(a);
    printf("%lu---------%lu\n", (unsigned long)a, (unsigned long)a1);
    b1 = htons(b);
    printf("%u-----%u\n", (unsigned)b, (unsigned)b1);
    return 0;
}

Ein Vorteil dieses Ansatzes besteht darin, dass er sogar mit Pre-C99-Implementierungen funktionieren kann, die dies nicht unterstützen <inttypes.h>. Eine solche Implementierung hätte es höchstwahrscheinlich nicht gegeben <stdint.h> auch nicht, aber die Technik ist für andere Integer-Typen nützlich.

  • Hier gibt es einen sehr kleinen Grenzfall, wenn signed int kein Zweierkomplement ist. In diesem Fall hält es den negativsten Zweierkomplementwert nicht korrekt. SEHR unbedeutend, gebe ich zu, aber etwas, auf das Sie achten sollten, wenn Sie maximale Portabilität wünschen.

    – paxdiablo

    25. März 2015 um 1:13 Uhr

  • @paxdiablo: Die intN_t Typen müssen Zweierkomplement ohne Füllbits sein. Wenn int kein Zweierkomplement ist, dann ist das intN_t Typen werden wahrscheinlich nicht definiert wenn nicht Die Implementierung unterstützt auch verschiedene Zweierkomplementtypen. Guter Punkt, aber ich denke, es ist ein noch kleinerer Randfall, als Sie vermuten.

    – Keith Thompson

    25. März 2015 um 2:58 Uhr

  • Ohne Zweifel. Ich vermute, Sie hätten Schwierigkeiten, auf dem Planeten eine Maschine zu finden, die die neuen integralen Typen aufwies, aber immer noch ein Einerkomplement oder ein Vorzeichen / eine Größe hatte int Typ 🙂

    – paxdiablo

    25. März 2015 um 4:50 Uhr

1410850cookie-checkWie drucke ich den Wert der Variablen uint32_t und uint16_t?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy