Antecedentes: tengo una serie de scripts que analizan los archivos de registro en busca de números hexadecimales al encontrar el "0x" inicial. Nuestra biblioteca C incrustada cambió a una nueva printf. El nuevo printf es más compatible con los estándares que nuestro anterior y mis scripts se rompieron.¿Por qué se imprime 0 (cero) sin "0x" al comienzo con el formato C printf "% # x"?
en una máquina Linux:
#include <stdio.h>
int main(void)
{
printf("%#010x\n", 0);
printf("%#010x\n", 1);
return 0;
}
salida (usando glibc) es:
0000000000
0x00000001
de salida en nuestro firmwware era:
0x00000000
0x00000001
De printf (3), en el carácter de la bandera '#': "Para x y X conversiones, un resultado distinto de cero tiene la cadena" 0x "(o" 0X "para X convers iones) precede a ella ".
Tengo curiosidad por qué. Sin excavar los documentos de estándares de C o comprar el almuerzo para los miembros del comité de normas, ¿por qué no un 0x líder en un argumento de valor cero?
Wild guess: 0 es 0 independientemente de la base, por lo que no hay necesidad de especificarlo. –
Vale la pena señalar que puede obtener el comportamiento de * siempre * incluyendo un '0x' inicial al escribir '" 0x% 08x "', mientras que el comportamiento descrito de manera estándar sería más complicado de obtener de una biblioteca que * siempre * incluía el liderando '0x'. Tal vez el comité de estándares estaba optimizando para un caso más difícil de conseguir, en lugar del caso absolutamente más común. (Por supuesto, no puede cambiar '"% # 10x "' a '" 0x% 8x "', pero entonces, es difícil imaginar que alguien quiera ver '0x0' sin relleno cero). – ruakh
No hay mención de esto en [C89 Rationale] (http://www.lysator.liu.se/c/rat/title.html) (HTML) o en [C99 Rationale] (http: //www.open-std. org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf) (PDF). –