Forum: Compiler & IDEs Printhex in gcc


von matthias (Gast)


Lesenswert?

Ich will eine zahl gröesser 2^32 in gnu cc in Hexformat ausgeben.

unsigned long long int val = 4 295 000 000;
val ist dann wohl unsigned long long int? also bis 64 bit.

printf ("%o2x",val);

Gibt: Typen passen nicht.

Bei unsigned int val = 2561;

geht printf ("%o2x",val); (hex a01)
M.

von Lars Schmitt (Gast)


Lesenswert?

Hallo Matthias,

ich kann aus deinem Beitrag leider nicht genau erkennen was du meinst.
Folgendes compiliert bei mir ohne Warnung oder sonstiges:
1
   unsigned long long int val = 4295000000;
2
   printf ("%llx",val);

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

matthias schrieb:
> Ich will eine zahl gröesser 2^32 in gnu cc in Hexformat ausgeben.
>
> unsigned long long int val = 4 295 000 000;
> val ist dann wohl unsigned long long int? also bis 64 bit.

Ja, es ist größer als 2^32-1 = 4 294 967 295.

Ob es long long sein muss, hängt von der ABI ab.  Auf LP64 genügt long, 
auf ILP64 genügt int um einen 64-BIt Wert darzustellen.

> printf ("%o2x",val);

Um einen unsigned long long als hex auszugeben:
  
1
#include <stdio.h>
2
3
int main ()
4
{
5
    printf ("%llx", -1ull);
6
}
 
um einen unsigned 64-Bit Wert als hex auszugeben:
 
1
#include <stdio.h>
2
#include <inttypes.h>
3
4
int main ()
5
{
6
    printf ("%" PRIx64, UINT64_C (-1));
7
}
 
Beides erfordert mindestens C99.

von matthias (Gast)


Lesenswert?

ja danke auf llx wär ichnicht gekommen
so was wie "lllx" für __int128 Typen musste ich mir selber schreiben 
also ein printf_128 in dezimal.
Thx

//        \\\//
//        (o|o)
// --o00o-------oOOo--------------------
// printf_128
// -------------------------------------

void printf_128(__int128 path)
{

// Ausgabe int128 im Dezimalformat
// jeweils 6 Ziffern durch Kommata getrennt

int ziffer[42];
int cnt = 0;
int loop;
if (path ==0) printf ("0");
while (path>0)
        {
        ziffer[cnt]=path%10;
        path=path/10;
        cnt++;
        }

for (loop = cnt-1;loop>=0;loop--)
        {
        printf("%i",ziffer[loop]);
        if ( (loop%6==0) && (loop>0) )
                printf(",");
        }
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Abgesehen davon, daß die Verwendung von printf für die Ausgabe 
einzelner Zeichen recht ineffizient ist (ein simples putc würde hier 
genügen*), kann diese Routine nichts mit negativen Zahlen anfangen - sie 
ist also bestenfalls für uint128_t, aber nicht für int128_t geeignet.

*) Für die Ausgabe einer Zahl zwischen 0 und 9 so:
putc(zahl + '0');

von Dirk B. (dirkb2)


Lesenswert?

matthias schrieb:
> ja danke auf llx wär ichnicht gekommen

Darauf musst du auch nicht alleine kommen, das ist dokumentiert:
http://www.cplusplus.com/reference/cstdio/printf/

matthias schrieb:
> printf ("%o2x",val);

Durch das kleine o hinter dem % wäre das auch eine oktale Ausgabe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.