2012-03-07 2 views
12

So che possiamo usare printf ("% 04X", valore); per stampare valori esadecimali senza segnocome stampare l'esadecimale con segno in c

c'è un flag simile o una funzione in c che è possibile utilizzare per stampare valori esadecimali con segno?

qualcosa di simile come questo

BINARY HEX(SIGNED) HEX (UNSIGNED) 
-------- ----------- -------------- 

00000010 +0x2  0x2 
00000001 +0x1  0x1 
00000000 +0x0  0x0 
11111111 -0x1  0xFF 
11111110 -0x2  0xFE 
11111101 -0x3  0xFD 

risposta

0

Che cosa si intende per un valore esadecimale "firmato"? Vuoi qualcosa come "-e0"? Se sì, cosa significherebbe? Il segno è già rappresentato nella visualizzazione esadecimale, poiché mostra tutti i bit e questa è tutta l'informazione contenuta nel numero.

+1

Beh, può essere interpretato come valore esadecimale con il segno di fronte ad essa. Se uno può volerlo per una ragione valida è un altro problema :) –

+0

vedere la mia modifica sopra – David

3

No, ma si può fare qualcosa di simile a

printf("%c%04X",(x<0)?'-':' ',(x<0)?-x:x); 

Ma, come altro punto fuori, è dubbio che ci sia un motivo valido per farlo. Assicurati di capire esattamente che cosa stai chiedendo.

EDIT: secondo la modifica al tuo post, ti capisco quello che stai chiedendo, quindi è tutta colpa tua ;-)

+0

Se non ti piacciono i bug e l'offuscamento, potresti semplicemente fare 'if (x <0) printf (" - ")' prima di stampare il numero. Perché hai due possibili errori nel codice. – Lundin

+0

Primo bug possibile: '(x <0)? '-': ''' passa un int a printf, non un char come previsto. Questo perché il 2 ° e 3 ° operando dell'operatore?: Sono bilanciati. Entrambi gli operandi sono quindi soggetti a promozioni implicite intere. Questo è particolarmente negativo in C++, dove i caratteri letterali sono di tipo char e non int come in C. – Lundin

+0

Secondo possibile bug: '(x <0)? - x: x' Se x è firmato, il codice non lo rende senso di usare unario - operatore, perché x sarebbe già nel formato desiderato. Se x non è firmato, non ha senso usare unario -, poiché il risultato è un tipo senza segno. E anche se sei riuscito a ottenere il 2 ° operando di?: A un tipo firmato, sarebbe comunque bilanciato a un tipo senza segno, a causa del 3 ° operando. – Lundin

7

Purtroppo la funzione di C printf non ha modo di farlo direttamente. Si potrebbe, naturalmente, cercare invece:

printf("%s%x\n", x<0?"-":"", x<0?-(unsigned)x:x); 

Edit: Credo Risolto il problema di gestire INT_MIN ...

+1

wuahhh, ora questo è un brutto scherzo ... Non c'è altro, nemmeno nel C99? in caso contrario: Accidenti a te, C. – Gewure