Esta é uma consulta mais curiosa do que uma questão importante, mas por que, ao imprimir hexadecimal como um número de 8 dígitos com zeros à esquerda, isso %#08X
não exibe o mesmo resultado que 0x%08X
?
Quando tento usar o primeiro, o 08
sinalizador de formatação é removido e não funciona apenas 8
.
Mais uma vez eu estava apenas curioso.
0x%.8X
? Isso irá preencher com zeros. (o0x
é apenas um preâmbulo, mas você provavelmente já está ciente disso).Respostas:
A
#
peça fornece um0x
na string de saída. A contagem0
e osx
caracteres "8" listados na08
parte. Você precisa pedir 10 caracteres se quiser que seja o mesmo.A alteração também de maiúsculas e minúsculas
x
afeta a caixa dos caracteres emitidos.fonte
14F
?i = 0;
, se as versões utilizadas%#
não incluirem o0x
prefixo.O "0x" conta para a contagem de oito caracteres. Você precisa
"%#010x"
.Note-se que
#
se não anexar o 0 x 0 - o resultado será0000000000
- então você provavelmente realmente deve apenas usar"0x%08x"
de qualquer maneira.fonte
A
%#08X
conversão deve preceder o valor com0X
; isso é exigido pelo padrão. Não há nenhuma evidência no padrão de que isso#
deva alterar o comportamento da08
parte da especificação, exceto que o0X
prefixo é contado como parte do comprimento (então você pode querer / precisar usar%#010X
. Se, como eu, você gosta do seu hexadecimal apresentado como0x1234CDEF
, você precisa usar0x%08X
para obter o resultado desejado.Você pode usar%#.8X
e isso também deve inserir os zeros à esquerda.Tente variações no seguinte código:
Em uma máquina RHEL 5 e também no Mac OS X (10.7.5), a saída era:
Estou um pouco surpreso com o tratamento de 0; Não sei por que o
0X
prefixo foi omitido, mas com dois sistemas separados, ele deve ser padrão. Isso confirma meus preconceitos contra a#
opção.O tratamento do zero é de acordo com o padrão.
(Enfase adicionada.)
Observe que usar
%#X
usará letras maiúsculas para os dígitos hexadecimais e0X
como prefixo; use%#x
usará letras minúsculas para os dígitos hexadecimais e0x
como prefixo. Se você preferir0x
que as letras de prefixo e maiúsculas, você tem que código0x
separadamente:0x%X
. Outros modificadores de formato podem ser adicionados conforme necessário, é claro.Para imprimir endereços, use o
<inttypes.h>
cabeçalho, ouintptr_t
tipo e aPRIXPTR
macro de formato:Exemplo de saída:
Escolha seu veneno no comprimento - acho que uma precisão de 12 funciona bem para endereços em um Mac executando o macOS. Combinado com o
.
para especificar a precisão mínima (dígitos), ele formata os endereços de maneira confiável. Se você definir a precisão como 16, os 4 dígitos extras serão sempre 0 na minha experiência no Mac, mas certamente há um argumento a ser usado para usar 16 em vez de 12 no código portátil de 64 bits (mas você usaria 8 para Código de 32 bits).fonte