hex için printf () biçimlendirmesi


191

Bu, önemli bir sorudan çok merak edilen bir sorgudan daha fazlasıdır, ancak neden altı rakamı baştaki sıfırlarla 8 basamaklı bir sayı olarak yazdırırken, bu %#08Xaynı sonucu göstermiyor 0x%08X?

Birincisini kullanmaya çalıştığımda, 08biçimlendirme bayrağı kaldırılır ve sadece ile çalışmaz 8.

Yine merak ettim.


3
Bunu mu demek istediniz 0x%.8X? Bu sıfırlarla başa çıkacaktır . (bu 0xsadece bir önsözdür, ancak muhtemelen bunun farkındasınızdır).
WhozCraig

Yanıtlar:


283

#Bölüm sizi bir verir 0xçıkış dizesinde. 0Ve xlistelenen "8" karakterler karşı sayım 08parçası. Aynı olmasını istiyorsanız 10 karakter istemeniz gerekir.

int i = 7;

printf("%#010x\n", i);  // gives 0x00000007
printf("0x%08x\n", i);  // gives 0x00000007
printf("%#08x\n", i);   // gives 0x000007

Ayrıca büyük / küçük harf durumunu değiştirmek, xverilen karakterlerin büyük / küçük harflerini etkiler.

printf("%04x", 4779); // gives 12ab
printf("%04X", 4779); // gives 12AB

En üst satır benim için 14F0x00000007 çıktı. İkinci ve üçüncü eserler yazılı olarak.
kuantumpotato

@quantumpotato - Bu ... tuhaf. Birinci ve üçüncü satırlar, üretmeleri gereken 0 sayısı hariç aynıdır. Bunu üreten derleyiciniz / sisteminiz / kod satırınız neydi? Yazdırılan çizgiye ilerleyen herhangi bir satır var 14Fmı?
Mike

19
Eğer kullanılırsa i = 0;, kullanılan sürümlerin öneki %#içermeyeceğini unutmayın 0x.
Jonathan Leffler

ama nasıl hex hakkında: 0x43A66C31C68491C0 Aşağıdakileri denedim: __int64 int64 = 0x43A66C31C68491C0; printf_s ("% # 15X% d", int64, int64); Ancak çıktı 0XC68491C0, 0x43A66C31C68491C0
123iamking

Yukarıdaki hex 0x43A66C31C68491C0 hakkında, çözdüm, çözüm 0x% I64X,% # 15X değil
123iamking 7:30 '

53

"0x" sekiz karakter sayımına dahil edilir. Gerek "%#010x".

Not #yok değil 0 0x eklemek - sonuç olacak 0000000000- muhtemelen aslında sadece kullanmalıdır yüzden "0x%08x"zaten.


34

%#08XDö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.080X%#010X0x1234CDEF0x%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 0Xatlandığı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.

ISO / IEC 9899: 2011 §7.21.6.1 fonksiyonufprintf

¶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.)


%#XKullanı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 0xayrı ayrı: 0x%X. Elbette gerektiğinde diğer format değiştiricileri de eklenebilir.

Adresleri yazdırmak için <inttypes.h>üstbilgiyi, uintptr_ttürü ve PRIXPTRbiç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).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.