2013-02-05 19 views
1

衆所周知,每個可打印字符都有其ascii值。我試圖將8個字符的ascii值設置爲64位整數,但它只複製32位。C - 複製字符ASCII值爲64位整數

char * ch = "AAAABBBB"; 
unsigned long int i; 

//copy charater's ascii to 64 bits int 
memcpy(&i, ch, 8); 
printf("integer hold: 0x%x\n", i); 

這段代碼有什麼問題嗎?

輸出我想到的是:

integer hold: 0x4141414142424242 

但產量:

integer hold: 0x41414141 
+2

調高你的警告! –

+0

@CarlNorum解決什麼問題?就編譯器而言,這段代碼很好。 – Lundin

+0

@Lundin,不匹配的printf格式字符串導致未定義的行爲。海灣合作委員會和鏗鏘會發現並警告這個問題。 Clang甚至提供了一個建議的解決方案 –

回答

2

如果unsigned long的確是一個64位的類型(可以輸出sizeof(unsigned long)檢查此),你仍然需要使用%lx格式字符串進行打印。

如果unsigned long是32位,則可能需要求助於unsigned long long並使用%llx格式字符串。

C11 7.20.6.1 The fprintf function

O,U,X,X將unsigned int參數被轉換爲無符號八進制(○),無符號十進制(U),或無符號十六進制表示法(x或X)在樣式dddd中;字母abcdef用於X轉換,字母ABCDEF用於X轉換。精度指定出現的最小位數;如果要轉換的值可用較少的數字表示,則用前導零擴展。默認精度爲1.以零精度轉換零值的結果不包含字符。

l(ell):指定以下d,i,o,u,x或X轉換說明符適用於long int或unsigned long int參數。

ll(ell-ell):指定以下d,i,o,u,x或X轉換說明符適用於long long long型或unsigned long long型int參數。

+0

這是關於格式字符串..謝謝! – REALFREE

-1

longlong long

在VC++中,long數據類型仍然只有32位。

當然,printf格式%x用於在大多數平臺上是32位的int。你想要%llx(或者如果你的long已經是64位,可能是%lx)。

+2

我在說C,而不是VC++。而且我已經檢查了8字節的unsigned long int大小。 – REALFREE

+0

@REALFREE請看我更新的答案。 _並且_你沒有指定編譯器,只是語言(並且C語言允許編譯器對某些類型有不同的位長) –

+0

是的,我只是想知道我做錯了什麼。感謝您的建議:) – REALFREE

-1

%x用於打印無符號整數值&其32位這就是爲什麼你會得到這樣的結果。

%d %i  Decimal signed integer. 
%o  Octal integer. 
%x %X  Hex integer. 
%u  Unsigned integer. 
%c  Character. 
%s  String. 
%f  double 
%e %E  double. 
%g %G  double. 
%p  pointer. 
,如果你想打印剩餘數據嘗試

& ......

int *p; 
p=(char *)(&i)+4; 

printf("integer hold: 0x%x\n", i); 
printf("integer hold: 0x%x\n",*p); 
相關問題