%#08X
Dönüşüm ile değer önce olmalıdır 0X
; standart için gerekli olan. Standartta , ön ekin uzunluğun bir parçası olarak sayılması dışında spesifikasyonun bir kısmının #
davranışını değiştirmesi gerektiğine dair bir kanıt yoktur (bu yüzden kullanmak isteyebilir / ihtiyacınız olabilir . Benim gibi, hex'iniz o zaman kullanmak zorunda istenilen sonucu elde etmek. şu şekilde kullanabilirsiniz ve o da lider sıfır eklemek gerekir.08
0X
%#010X
0x1234CDEF
0x%08X
%#.8X
Aşağıdaki koddaki varyasyonları deneyin:
#include <stdio.h>
int main(void)
{
int j = 0;
printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j);
for (int i = 0; i < 8; i++)
{
j = (j << 4) | (i + 6);
printf("0x%.8X = %#08X = %#.8X = %#010x\n", j, j, j, j);
}
return(0);
}
Bir RHEL 5 makinesinde ve ayrıca Mac OS X'te (10.7.5) çıktı:
0x00000000 = 00000000 = 00000000 = 0000000000
0x00000006 = 0X000006 = 0X00000006 = 0x00000006
0x00000067 = 0X000067 = 0X00000067 = 0x00000067
0x00000678 = 0X000678 = 0X00000678 = 0x00000678
0x00006789 = 0X006789 = 0X00006789 = 0x00006789
0x0006789A = 0X06789A = 0X0006789A = 0x0006789a
0x006789AB = 0X6789AB = 0X006789AB = 0x006789ab
0x06789ABC = 0X6789ABC = 0X06789ABC = 0x06789abc
0x6789ABCD = 0X6789ABCD = 0X6789ABCD = 0x6789abcd
0'ın tedavisine biraz şaşırdım; Ön ekin neden 0X
atlandığından emin değilim , ancak bunu yapan iki ayrı sistemle standart olmalı. Bu #
seçeneğe karşı önyargılarımı doğruluyor .
Sıfır tedavisi standarda göre yapılır.
¶6 Bayrak karakterleri ve anlamları:
...
#
Sonuç "alternatif formata" dönüştürülür. ... x
(veya X
) dönüşüm için sıfır olmayan bir sonucun önüne 0x
(veya 0X
) ön ek konmuştur. ...
(Vurgu eklenmiştir.)
%#X
Kullanımının onaltılık basamaklar ve 0X
önek için büyük harf kullanacağını unutmayın ; kullanıldığında %#x
, onaltılık basamaklar ve 0x
önek için küçük harfler kullanılır . İsterseniz 0x
önek ve büyük harfler gibi, sen koduna sahip 0x
ayrı ayrı: 0x%X
. Elbette gerektiğinde diğer format değiştiricileri de eklenebilir.
Adresleri yazdırmak için <inttypes.h>
üstbilgiyi, uintptr_t
türü ve PRIXPTR
biçim makrosunu kullanın:
#include <inttypes.h>
#include <stdio.h>
int main(void)
{
void *address = &address; // &address has type void ** but it converts to void *
printf("Address 0x%.12" PRIXPTR "\n", (uintptr_t)address);
return 0;
}
Örnek çıktı:
Address 0x7FFEE5B29428
Uzunluktaki zehirinizi seçin - 12 hassasiyetinin macOS kullanan bir Mac'teki adresler için iyi çalıştığını düşünüyorum. .
Minimum hassasiyeti (rakam) belirtmek için ile birleştiğinde adresleri güvenilir bir şekilde biçimlendirir. Hassasiyeti 16 olarak ayarlarsanız, Mac'teki deneyimimde fazladan 4 basamak her zaman 0 olur, ancak taşınabilir 64 bit kodda 12 yerine 16 kullanmak için kesinlikle bir durum vardır (ancak 8 için 32 bit kod).
0x%.8X
? Bu sıfırlarla başa çıkacaktır . (bu0x
sadece bir önsözdür, ancak muhtemelen bunun farkındasınızdır).