久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C++中的long long和__int64類(lèi)型

 9loong 2010-04-07

C語(yǔ)言中l(wèi)ong long的用法

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

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

在分析BT代碼的過(guò)程中,遇到了這樣的定義:long long line_position;很是納悶,,在C語(yǔ)言中我還沒(méi)有見(jiàn)過(guò)這樣的寫(xiě)法,,網(wǎng)上搜了,資料也很少,,最后在C語(yǔ)言標(biāo)準(zhǔn)與實(shí)現(xiàn)這本書(shū)中找到了關(guān)于long long的說(shuō)法,。在C語(yǔ)言的C99標(biāo)準(zhǔn)擴(kuò)展了新的整數(shù)類(lèi)型 long long,long是32位寬,,占4個(gè)字節(jié),,long long通常被定義成 64 位寬,也就可以實(shí)現(xiàn)了在32位機(jī)器上可以擴(kuò)展8字節(jié)的數(shù)據(jù),,GUN C也支持,,當(dāng)然在64位平臺(tái)上就存在這個(gè)問(wèn)題了,。C99標(biāo)準(zhǔn)并沒(méi)有硬性規(guī)定具體到某種平臺(tái)上的某種整數(shù)類(lèi)型究竟占用多少字節(jié),、能夠表示多大范圍的數(shù)值等, 只是給出一條原則和一個(gè)參考數(shù)值集合,,只要同時(shí)滿足這兩方面條件就算是符合 C 標(biāo)準(zhǔn),。
之后,我查看了C99標(biāo)準(zhǔn):
—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.

意思是說(shuō):
long long 的級(jí)別高于 long ,long 的級(jí)別高于 int ,,int 的級(jí)別高于 short ,,short 的級(jí)別高于 char 。(另外有 _Bool 永遠(yuǎn)是最低級(jí)別),。級(jí)別高的整數(shù)類(lèi)型的寬度大于等于級(jí)別較低的整數(shù)類(lèi)型,。


編譯long long需要支持C99標(biāo)準(zhǔn)的編譯器才行,VC并不支持,,但有對(duì)應(yīng)的類(lèi)型__int64


C++ __int64用法

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



  在做ACM題時(shí),, 經(jīng)常都會(huì)遇到一些比較大的整數(shù)。而常用的內(nèi)置整數(shù)類(lèi)型常常顯得太小了:其中long int 范圍是[-2^31,2^31),,即-2147483648~2147483647,。而unsigned范圍是[0,2^32),即0~4294967295,。也就 是說(shuō),,常規(guī)的32位整數(shù)只能夠處理40億以下 的數(shù)。
  那遇 到比40億要大的數(shù)怎么辦呢,?這時(shí)就要用到C++64位擴(kuò)展 了,。不同的編譯器對(duì)64位整數(shù)的擴(kuò)展有所不同?;?/span>ACM的需 要,,下面僅介紹VC6.0g++編譯器的 擴(kuò)展。
  VC64位整數(shù) 分別叫做__int64unsigned __int64,,其范 圍分別是[-2^63, 2^63)[0,2^64),,即-9223372036854775808~92233720368547758070~18446744073709551615(1800億億)。對(duì)64位整數(shù) 的運(yùn)算與32位整數(shù)基本相同,,都支持四則運(yùn)算與位運(yùn)算等,。當(dāng)進(jìn)行64位與32位的混 合運(yùn)算時(shí),32位整數(shù)會(huì)被隱式轉(zhuǎn)換成64位整 數(shù),。但是,,VC的輸入輸出與__int64的兼容 就不是很好了,如果你寫(xiě)下這樣一段代碼:
1 __int64 a;
2 cin >>
a;
3 cout << a;

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

使用無(wú)符號(hào)數(shù)時(shí),將"%lld"改成"%llu"即可,。
  最后我補(bǔ)充一點(diǎn):作為一個(gè)特例,,如果你使用的 是Dev-C++g++編譯器,它使用的是"%I64d"而非"%lld",。


__int64的printf問(wèn)題,!

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

把Linux的東西移植到Windows 下, 問(wèn)題真是多,, 有時(shí)候感覺(jué)很是奇怪! 今天有遇到了一個(gè),!

__int64在 Windows下怎么輸出的問(wèn)題,? 我還以為是強(qiáng)制轉(zhuǎn)換的時(shí)候出問(wèn)題了, 查了好長(zhǎng)時(shí)間,!

下面是測(cè)試代碼,, 已經(jīng)通過(guò)Windws, Linux兩個(gè)平臺(tái)的測(cè)試了,!

#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
 */

在進(jìn)行移植的時(shí)候可能用的上的:
#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"

 TAG __int64 printf uint64_t
 發(fā)表于: 2007-10-18,,修改于: 2007-10-18 16:21 



(#)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多