1. 程式人生 > >整理C/C++中的64位整型

整理C/C++中的64位整型


關於基本型別中的整型,預設的一些 short、int、long 等大家都比較熟悉。int、long 佔用 4 個位元組32位,最大能表示的無符號正整數也才是 4294967295,也就是 42億多。現如今社會中各種各樣的數量需要整型來表示,但數目已遠遠超過 4294967295,比如當今的世界人口,等等。比如開發過程中經常要用到的毫秒級時間戳,即代表從1970年到現在為止經過的毫秒數。這些數值都超過了 4294967295,普通的 int 和 long 已經無法表示的下了,所以又出現佔用 8個位元組的64位整型:long long、_int64、__int64,其無符號能表示的最大正整數是:18446744073709551615,已經非常大了。。。可為什麼有三種?下面給大家說下!


C99標準以前:
64位整型是一種沒有明確規範的資料型別,各種主流的編譯器對64位整型的支援也是標準不一,形態各異。於是便出了 long long、_int64、__int64 這麼幾種;

C99標準推出:
C99將 long long 納入到 C++標準中,並規定 long long 型別的位數不低於64位;
Linux上GCC從4.5版本開始,完全支援C99標準,因此可以使用 long long 表示64位整數;
Windows 下 VC6.0 是1998年推出的,所以不支援C99標準,但是Windows為了支援64位整型,自己提供了__int64 型別來表示64位整數,VC6.0中還可以使用少一個下劃線的版本 _int64


C++11標準推出:
long long 進入了 C++11 標準,同樣定義為位數不低於64位;
GCC4.8開始支援 C++11,將 long long 型定義為64位,Visual Studio 2013 開始支援 C++11,同樣將 long long 定義為64位。

備註:不過微軟為了支援以前的程式程式碼,所以在 VC6.0 以及以後的編譯器中都支援 _int64 及 __int64 型別。

好了,8個位元組64位的整型我們搞清楚了之後,那麼在進行列印輸出或者格式化字串的時候,用 % 什麼呢?普通的 %d 肯定是不行了,應該用什麼呢?

long long => %lld
unsigned long long => %llu
__int64 => %I64d

unsigned __int64 => %I64u

OK了,基本就給大家講完了。為了通用性和移植性,建議大家還是使用 long long 型別吧,不過如果大家手頭還是古董級別的 VC6.0 或者 低於支援 C++11 標準版本的編譯器:VS2002、VS2003、VS2005、VS2008、VS2010、VS2012,那麼只能使用 __int64 了。

有的網友會說了,long long 太長了,unsigned long long 更長,還是不如 __int64 方便!其他網友要說了,你直接 typedef 一下不就得了就可以使用短名字了:
typedef signed long long                TSint64;

typedef unsigned long long                TUint64;

這樣定義完之後可以直接使用 TSint64 和 TUint64 了。

以上!