%x
è solo per la stampa unsigned int
, tuttavia si fornisce un char
.
L'utilizzo di %x
con un valore negativo di char
causa un comportamento non definito.
A parte: Le specifiche C standard di printf
non sono particolarmente chiare; alcuni ritengono che il passaggio di qualsiasi cosa eccetto esattamente un unsigned int
causi un comportamento non definito. Altri (me compreso) ritengono che sia corretto passare argomenti che non sono specificatamente unsigned int
, ma dopo le promozioni degli argomenti predefiniti, digitare int
con un valore non negativo.Lo standard garantisce che gli int
non negativi abbiano la stessa rappresentazione dello unsigned int
con lo stesso valore.
Alcune delle altre risposte suggeriscono %hhx
, ma che non è niente di meglio di %x
. Lo standard (su un'interpretazione ragionevole) specifica che %hhx
può essere utilizzato solo con un argomento unsigned char
e che %hhd
può essere utilizzato solo con un argomento signed char
. Non c'è in realtà alcun modificatore per il semplice char
.
In entrambi i casi, è possibile utilizzare lo printf
per convertire i valori negativi in rappresentazioni positive in modo ben definito. È necessario convertire autonomamente l'argomento e quindi utilizzare un identificatore di formato corrispondente. In questo caso:
printf ("%hhx\n", (unsigned char)testchar);
sarebbe una opzione. IMO %x
potrebbe essere utilizzato qui, ma come detto sopra, alcuni non sono d'accordo.
NB. L'identificatore di formato errato viene utilizzato in printf ("%d\n", sizeof(char));
e nella riga successiva. Lo specificatore per size_t
è %zu
. Così si potrebbe usare sia %zu
, o lanciare l'argomento int
, o meglio ancora:
printf("1\n");
fonte
2016-06-13 03:35:20
Immagino che "si interrompa" a causa di% x. Hai provato% d? – Jasper
O printf% x o% d su tutto, qui viene visualizzato il valore decimale ed esadecimale. – DrakaSAN
Non capisco assolutamente perché stai sottraendo 127, e penso che sia un vero peccato che non ti sia preso la briga di spiegare questo approccio nella tua domanda. –