Background: ho un numero di script che analizzano i file di registro alla ricerca di numeri esadecimali trovando il "0x" iniziale. La nostra libreria C incorporata è stata modificata in una nuova printf. Il nuovo printf è più conforme agli standard rispetto al nostro precedente e i miei script si sono interrotti.Perché 0 (zero) viene stampato senza "0x" iniziale con C printf formato "% # x"?
Su una macchina Linux:
#include <stdio.h>
int main(void)
{
printf("%#010x\n", 0);
printf("%#010x\n", 1);
return 0;
}
uscita (usando glibc) è:
0000000000
0x00000001
uscita sul nostro firmwware era:
0x00000000
0x00000001
Da printf (3), sulla il carattere "#" flag: "Per le conversioni x e X, un risultato diverso da zero ha la stringa" 0x "(o" 0X "per X convers ioni) si è preposto ad esso. "
Sono curioso perché. Senza scavare nei documenti standard C o comprare il pranzo per i membri del comitato standard, perché non un 0x iniziale su un argomento a valore zero?
ipotesi selvaggia: 0 è 0 indipendentemente dalla base, quindi non è necessario specificarlo. –
Vale la pena notare che è possibile ottenere il comportamento di * sempre * compreso un '0x' iniziale scrivendo' "0x% 08x" ', mentre il comportamento descritto standard sarebbe più complesso da ottenere da una libreria che * sempre * includeva il che porta a '0x'. Forse la commissione per gli standard stava ottimizzando per un caso più difficile da ottenere, piuttosto che per il caso assolutamente più comune? (Naturalmente, non puoi cambiare '"% # 10x "' a '" 0x% 8x "', ma poi, è difficile immaginare qualcuno che voglia vedere '0x0' senza padding zero.) – ruakh
Non si fa menzione di questo nella [C89 Rationale] (http://www.lysator.liu.se/c/rat/title.html) (HTML) o nella [C99 Rationale] (http: //www.open-std. org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf) (PDF). –