C ++ - 荒谬的长远程

时间:2013-11-01 20:14:57

标签: c++ long-integer

我和我的朋友刚刚遇到一个非常奇怪的长距离问题。 所以基本上,我的电脑有一个64位处理器,但上面有一个32位系统。他有32位操作系统和CPU。

首先,我们打印sizeof(long long)。我们两个人都是8岁。

然后我们这样做了:

long long blah = 1;

printf ("%lld\n", blah<<40);

对我来说,这会返回1099511627776(这是正确的结果)。对他而言是0。

怎么可能?我们都有相同的尺寸。

提前致谢。

编辑: 我使用Code Blocks 12.11在Win7下编译并运行它。他使用Win XP和相同版本的CB。

EDIT2:请求的源代码:

#include <cstdio>

int main()
{
    long long blah = 1;

    printf ("%lld\n", blah<<40);

    return 0;
}

#include <cstdio>

int main()
{
    printf ("%d", sizeof(long long));

    return 0;
}

2 个答案:

答案 0 :(得分:3)

我猜你和你的朋友正在链接到臭名昭着的MSVCRT.DLL或其他一些图书馆的不同版本。

来自Code :: Blocks FAQ:

  

问:什么Code :: Blocks不是?

     

答:Code :: Blocks不是编译器,也不是链接器。 Code :: Blocks的发布包可能包括编译器套件(MinGW / GCC),如果目标平台尚未提供的话。但是,这是“原样”提供的,而不是由Code :: Blocks开发团队开发/维护的。

所以声明“我编译并使用Code Block 12.11在Win7下运行它”并不严格;你不能用不是编译器的东西编译。

弄清楚你们两个实际使用的编译器(参见上文:它不是“代码块”)和什么库。

答案 1 :(得分:1)

可能是两个问题之一:打印系统无法长时间处理或移位操作符不能超过32位。试试这个

#include <cstdio>
int main()
{
   union
   {
      long long one;

      // Intel based systems are back to front
      struct {
         long lo;
         long hi;
      } two;
   } xxx;

   xxx.one = 1LL;
   xxx.one = xxx.one << 40;
   printf ("%016llx %08x %08x\n", xxx.one, xxx.two.hi, xxx.two.lo);
   return 0;
}

如果第一个数字全是零而另外两个不是,那么printf就无法应对。如果所有数字都为零,则不会为64位定义移位运算符。