To bardziej ciekawe pytanie niż ważne pytanie, ale dlaczego drukując szesnastkę jako 8 cyfr z zerami wiodącymi, nie %#08X
wyświetla tego samego wyniku co 0x%08X
?
Kiedy próbuję użyć tego pierwszego, 08
flaga formatowania jest usuwana i nie działa tylko z 8
.
Znów byłem po prostu ciekawy.
0x%.8X
? Które będą prowadzić napełnić zerami. (0x
to tylko preambuła, ale prawdopodobnie już o tym wiesz).Odpowiedzi:
#
Część daje0x
w ciągu wyjściowym. Liczniki0
ix
liczą się do twoich „8” znaków wymienionych w08
części. Musisz poprosić o 10 znaków, jeśli chcesz, aby były takie same.Również zmiana wielkości liter
x
wpływa na wielkość znaków wyświetlanych znaków.źródło
14F
?i = 0;
używane wersje%#
nie będą zawierać0x
prefiksu.„0x” liczy się do liczby ośmiu znaków. Trzeba
"%#010x"
.Zauważ, że
#
nie nie dołączy 0x 0 - wynik będzie0000000000
- tak pewnie faktycznie należy po prostu użyć"0x%08x"
tak.źródło
%#08X
Konwersja musi poprzedzać wartość z0X
; jest to wymagane przez standard. W standardzie nie ma dowodów na to, że#
powinien on zmienić zachowanie08
części specyfikacji, z wyjątkiem tego, że0X
prefiks jest liczony jako część długości (więc możesz chcieć / potrzebować użyć%#010X
. Jeśli, podobnie jak ja, podoba ci się twój hex prezentowany jako0x1234CDEF
, musisz użyć,0x%08X
aby osiągnąć pożądany wynik. Możesz użyć%#.8X
i to również wstawić wiodące zera.Wypróbuj odmiany następującego kodu:
Na maszynie RHEL 5, a także w systemie Mac OS X (10.7.5), wynik był następujący:
Jestem trochę zaskoczony traktowaniem 0; Nie jestem pewien, dlaczego
0X
prefiks został pominięty, ale ponieważ robią to dwa oddzielne systemy, musi to być standard. Potwierdza to moje uprzedzenia wobec tej#
opcji.Traktowanie zera jest zgodne ze standardem.
(Podkreślenie dodane.)
Zauważ, że użycie
%#X
spowoduje użycie wielkich liter dla cyfr szesnastkowych i0X
jako prefiksu; Użycie%#x
spowoduje użycie małych liter dla cyfr szesnastkowych i0x
jako prefiksu. Jeśli wolisz0x
jako prefiksu i dużych liter, trzeba kodzie0x
oddzielnie:0x%X
. Oczywiście w razie potrzeby można dodać inne modyfikatory formatu.Do drukowania adresów użyj
<inttypes.h>
nagłówka oraz makrauintptr_t
typu iPRIXPTR
formatu:Przykładowe dane wyjściowe:
Wybierz truciznę na długość - uważam, że dokładność 12 działa dobrze w przypadku adresów na komputerze Mac z systemem macOS. W połączeniu z
.
określeniem minimalnej precyzji (cyfr), niezawodnie formatuje adresy. Jeśli ustawisz precyzję na 16, dodatkowe 4 cyfry są zawsze z mojego doświadczenia na Macu równe 0, ale z pewnością należy rozważyć użycie 16 zamiast 12 w przenośnym 64-bitowym kodzie (ale użyłbyś 8 dla Kod 32-bitowy).źródło