2013-10-20 17 views
5
#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char buf[256] = {}; 
    unsigned long i=13835058055298940928; 
    snprintf(buf, 1024, "%lx", i); /* Line 7 */ 
    printf("%s\n",buf); 
    return 0; 
} 

, sonra snprintf herhangi bir dönüştürme yapmaz %lux kullanımı ve sadece %lx kullanmak, bir tahmin heks dönüşüm basar ise sadece 0x13835058055298940928x basar ise.İşaretsiz uzun altıgen temsil hattı 7

İmzasız uzun onaltıyı nasıl temsil edebilirim?

+3

Onaltılık işareti imzalı veya imzasızdır - x ihtiyacınız olan her şeydir. –

+1

'% lux','% lu' + 'x' –

+0

olarak kabul edilir ve '1024' yerine arabellek alanı –

cevap

16

"%lux" biçimi, "%lu" (imzasız uzun, ondalık) ve ardından x numaralı bir mektup olarak kabul edilir.

"%x" biçimi, imzasız türden bir argüman gerektirir; Onaltılık biçimde imzalı tamsayılar basmak için hiçbir (doğrudan) mekanizma yoktur.

Onaltılı olarak unsigned long değerini yazdırma biçimi "%lx" şeklindedir. (xu işaretsiz desimaldir, d ondalık imzalanır, heksadesimaldir, bunların herhangi bir uzun süre l ile nitelikli olabilir.) Bu değer 13835058055298940928 taşma olmadan saklamak için en az bir 64-bit işaretsiz tipi gerektiren

Not . unsigned long tipi en az 32 bittir; numaralı sistemlerinde 64 bit var, ama hiçbir şekilde. Kodunuzun taşınabilir olmasını istiyorsanız, unsigned long yerine unsigned long long yazın. Onaltılı olarak unsigned long long değerini yazdırmak için kullanılan biçim "%llx".

Anlaşılır olması için, genellikle 0x ile onaltılık çıktı önüne, bu yüzden bir onaltılık sayı okuyucuya açıktır:

printf("0x%llx\n", some_unsigned_long_long_value); 

(Sen %#llx ile aynı sonucu elde edebilirsiniz, ama daha kolay bulmak 0x, # bayrağının anlamını hatırlatmaktan başka bir şey yazmaz.)

+0

Benim oyımı alır. 32/64 bit detaylar - özellikle taşınabilirlik ile ilgili daha iyi ve daha kapsamlı bir kaplama. :başparmak havaya: – enhzflep