Long Long、__int64使用總結

前言:
  在16位環境下,int/unsigned int 佔16位,long/unsigned long佔32位
  在32位環境下,int佔32位,unsigned int佔16位,long/unsigned long佔32位
何時需要使用:
  long 和 int 範圍是[-2^31,2^31),即-2147483648~2147483647,而unsigned範圍是[0,2^32),即0~4294967295,所以常規的32位整數只能夠處理40億左右,當遇到比40億大的多的數就要用到64位。
64位使用範圍:
  不同的編譯器對64位整數的擴展有所不同,VC使用__int64/unsigned __int64,範圍是[-2^63, 2^63)和[0,2^64),即-9223372036854775808~9223372036854775807與 0~18446744073709551615(約1800億億)。
注意點:
1、編譯器不同導致使用64位的申明方式不同;
2、long long / unsigned long long 一般是Linux下申明方式、如:G++
3、__int64 /unsigned __int64一般是Windows下使用64位的申明方式,如:VS
4、在賦值時需要注意加上ll進行顯式賦值;
5、當進行64位與 32位的混合運算時,32位整數會被隱式轉換成64位整數。
6、輸出printf("");,long long使用%lld輸出,__int64使用%I64d,無符號使用u替代d即可。
7、測試下來編譯器一般都支持2種操作,不必太過糾結,怎麼使用看個人喜歡。

//=================================華麗的分隔線========================================
#include <stdio.h>
#include <stdlib.h>
intmain(){
    unsigned long longa= 412432424000ll;
    unsigned __int64b= 9223372036854775808ll;
    printf("%I64u\n",a);                 //使用%lld時無法正常輸出,why? 解答在附
    printf("%I64u",b);
    system("pause");
    return 0;
}
附網友測試結果:
  剛實驗了下,在VC6、DEV、CodeBlocks中C語言都可以使用__int64,格式化輸出標識爲%I64d。不過在VC6中數字後加2個L是會報錯,可以只加1個或不加。查了下資料,__int64是windows專用的,被vc、gcc等編譯器支持,但在在UNIX、Linux中需用long long配合%lld。後者是標準C的規定!
  我試了下long long配合%I64d,可以正確輸出,而不管是long long還是__int64配合%lld都不能正確輸出。所以我得出的結論是在windows下需要用longlong或,__int64配合%64d。而在UNIX、Linux中必須使用標準C規定的long long配合%lld。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章