#ifdef _MSC_VER
typedef __int64 Int64;
typedef unsigned __int64 UInt64;
#else
typedef long long int Int64;
typedef unsigned long long int UInt64;
#endif
UInt64 tmp  = (1024*1024*1024);  // 1G ,这个正常
         UInt64 tmp1 = (10*1024*1024*1024); // 10G,这个tmp1 将被赋予 0

解决方案 »

  1.   

    sorry ,上面的代码应该是 UInt64 tmp =  (1024*1024*1024);  //1073741824
    UInt64 tmp1 = (10*1024*1024*1024); //18446744071562067968
    UInt64 tmp2 = (100*1024*1024*1024);//0
      

  2.   

    10*1024*1024*1024编译时会被默认为int类型的乘法,它是一个负值.转换为64位无符号值,那么就等于0xFFFFFFFFFFFFFFFF +1 - 0x80000000 = 18446744071562067968.
    10*1024*1024*1024的32位运算结果为0x80000000.就是1010左移30位的结果.
    所以你运算时要在第一个常数前加(UInt64)转换为64位的运算.
      

  3.   

    0x80000000作为有符号值是负数,会被CPU做减法运算.