2009年3月11日 星期三

資料型態 unsigned long long (ULONGLONG)

一般來講,我們很少用到位元長度較長的資料型態,因為不需要如此長的儲存空間。但是最近在儲存BT Mac Address時就需要用到unsigned long long(ULONGLONG),因為BT Mac Address是由12個hex數字組合成的,也就是需要48位元的儲存空間,所以需要ULONGLONG(64位元)才夠儲存。

為了印出這些長字元,printf()就必須要設定長字元的修飾字,比如要印出ULONGLONG的字元,就必須要用lld或llx,其中ll就是修飾字,寫法如下:

printf("%11x", 1<<44);

可是印出來的結果確是0,還是錯的,這到不是printf()的參數llx的問題。
問題是出在shitf的運算上面,1<<44在運算時,用32bit的int還儲存1,但是左移44位後,就超出32位元儲存的範圍,所以就溢位變成0了,正確的改法如下

printf("%llx", ((ULONGLONG)1<<44 ));

這樣就印出1000000000000,這樣就正確了。先讓1以64位元儲存,在shift就沒問題了。

沒有留言: