1. 程式人生 > >C++中的long long和 int64型別(轉載)

C++中的long long和 int64型別(轉載)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

C語言中long long的用法

http://www.awuit.com/c-language-the-usage-of-long-long/

阿吳 | C/C++ | 十一月, 03 2009 |
5 Comments

在分析BT程式碼的過程中,遇到了這樣的定義:long long line_position;很是納悶,在C語言中我還沒有見過這樣的寫法,網上搜了,資料也很少,最後在C語言標準與實現這本書中找到了關於long long的說法。在C語言的C99標準擴充套件了新的整數型別 long long,long是32位寬,佔4個位元組,long long通常被定義成 64 位寬,也就可以實現了在32位機器上可以擴充套件8位元組的資料,GUN C也支援,當然在64位平臺上就存在這個問題了。C99標準並沒有硬性規定具體到某種平臺上的某種整數型別究竟佔用多少位元組、能夠表示多大範圍的數值等,只是給出一條原則和一個參考數值集合,只要同時滿足這兩方面條件就算是符合 C 標準。
之後,我查看了C99標準:
—The rank of long long int shall be greater than the rank of long int,which
shall be greater than the rank of int,which shall be greater than the rank of short
int,which shall be greater than the rank of signed char.

意思是說:
long long 的級別高於 long ,long 的級別高於 int ,int 的級別高於 short ,short 的級別高於 char 。(另外有 _Bool 永遠是最低級別)。級別高的整數型別的寬度大於等於級別較低的整數型別。


編譯long long需要支援C99標準的編譯器才行,VC並不支援,但有對應的型別__int64


 

C++ __int64用法

http://341871.blog.51cto.com/331871/71253

轉自: [url]http://www.cnitblog.com/cockerel/archive/2006/08/16/15356.html[/url]
C++64位整數[原]by 赤兔
  在做ACM題時,經常都會遇到一些比較大的整數。而常用的內建整數型別常常顯得太小了:其中long int 範圍是[-2^31,2^31),即-2147483648~2147483647。而unsigned範圍是[0,2^32),即0~4294967295。也就是說,常規的32位整數只能夠處理40億以下的數。
  那遇到比40億要大的數怎麼辦呢?這時就要用到C++64位擴充套件了。不同的編譯器對64位整數的擴充套件有所不同。基於ACM的需要,下面僅介紹VC6.0g++編譯器的擴充套件。
  VC64位整數分別叫做__int64unsigned __int64,其範圍分別是[-2^63, 2^63)[0,2^64),即-9223372036854775808~92233720368547758070~18446744073709551615(1800億億)。對64位整數的運算與32位整數基本相同,都支援四則運算與位運算等。當進行64位與32位的混合運算時,32位整數會被隱式轉換成64位整數。但是,VC的輸入輸出與__int64的相容就不是很好了,如果你寫下這樣一段程式碼: 1 __int64 a;
2 cin >>
a;
3 cout << a;

那麼,在第2行會收到“error C2679: binary '>>' : no operator defined which takes a right-hand operand of type '__int64' (or there is no acceptable conversion)”的錯誤;在第3行會收到“error C2593: 'operator <<' is ambiguous”的錯誤。那是不是就不能進行輸入輸出呢?當然不是,你可以使用C的寫法: scanf("%I64d",&a);
printf("%I64d",a);
就可以正確輸入輸出了。當使用unsigned __int64時,把"I64d"改為"I64u"就可以了。
  OJ通常使用g++編譯器。其64位擴充套件方式與VC有所不同,它們分別叫做long long unsigned long long。處理規模與除輸入輸出外的使用方法同上。對於輸入輸出,它的擴充套件比VC好。既可以使用 1 long long a;
2
cin>>a;
3 cout<<a;
也可以使用 scanf("%lld",&a);
printf("%lld",a);

使用無符號數時,將"%lld"改成"%llu"即可。
  最後我補充一點:作為一個特例,如果你使用的是Dev-C++g++編譯器,它使用的是"%I64d"而非"%lld"


__int64的printf問題!

http://blog.chinaunix.net/u/19782/showart_403061.html


把Linux的東西移植到Windows 下, 問題真是多, 有時候感覺很是奇怪! 今天有遇到了一個!

__int64在 Windows下怎麼輸出的問題? 我還以為是強制轉換的時候出問題了, 查了好長時間!

下面是測試程式碼, 已經通過Windws, Linux兩個平臺的測試了!

#include <stdio.h>

#ifdef _WIN32
typedef unsigned __int64 uint64_t;
#else
typedef unsigned long long uint64_t;
#endif

typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;

int main(int argc, char *argv[])
{
  uint32_t t321, t322, t323;
  uint64_t t641, t642, t643;
  uint8_t *p;

  uint8_t t[64] =
    {
        0x4E, 0x7C, 0x00, 0x00, 0x00, 0x00,
        0x4E, 0x7C, 0x00, 0x00, 0x00, 0x00,
        0x04, 0x00, 0x00, 0x00, 0x00, 0x00
    };

  printf(
    "sizeof(uint64_t) = %d/n"
    "sizeof(uint32_t) = %d/n"
    , sizeof(uint64_t), sizeof(uint32_t));

  p = t;
  t321 = *(uint32_t *)p; p += 6;
  t322 = *(uint32_t *)p; p += 6;
  t323 = *(uint32_t *)p; p += 6;

  printf("t321[%X].%d t322[%X].%d t323[%X].%d/n"
    , t321, t321, t322, t322, t323, t323);

  p = t;
  t641 = *(uint32_t *)p; p += 6;
  t642 = *(uint32_t *)p; p += 6;
  t643 = *(uint32_t *)p; p += 6;

#ifdef _WIN32
  printf("t641[%I64X].%I64d t642[%I64X].%I64d t643[%I64X].%I64d/n"
    , t641, t641, t642, t642, t643, t643);
#else
  printf("t641[%llX].%lld t642[%llX].%lld t643[%llX].%lld/n"
    , t641, t641, t642, t642, t643, t643);
#endif

  t641 = 0x1122334455667788;

#ifdef _WIN32
  printf("%I64X %I64d /n", t641, t641);
#else
  printf("%llX %lld /n", t641, t641);
#endif

  return 0;
}


/*
Test Env:
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
    Microsoft Windows 2000 [Version 5.00.2195]

Result:
    sizeof(uint64_t) = 8
    sizeof(uint32_t) = 4
    t321[7C4E].31822 t322[7C4E].31822 t323[4].4
    t641[7C4E].31822 t642[7C4E].31822 t643[4].4
    1122334455667788 1234605616436508552

--------------------------------------
Test Env:
    gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-47.3)

Result:
    sizeof(uint64_t) = 8
    sizeof(uint32_t) = 4
    t321[7C4E].31822 t322[7C4E].31822 t323[4].4
    t641[7C4E].31822 t642[7C4E].31822 t643[4].4
    1122334455667788 1234605616436508552
 */

在進行移植的時候可能用的上的:
#ifdef _WIN32
#  define APR_UINT64_T_HEX_FMT     "llx"
#else
#  define APR_UINT64_T_HEX_FMT     "I64x"
#endif

example:
     sprintf(buf, "%" APR_UINT64_T_HEX_FMT, var);

#define HOST_WIDEST_INT_PRINT_DEC       "%I64d"
#define HOST_WIDEST_INT_PRINT_UNSIGNED  "%I64u"
#define HOST_WIDEST_INT_PRINT_HEX       "0x%I64x"
           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述