2

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

首先,我们打印了sizeof(long long). 对我们俩来说,那是 8。

然后我们这样做了:

long long blah = 1;

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

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

这怎么可能?我们都有相同的sizeofs。

提前致谢。

编辑:我在 Win7 下使用 Code Blocks 12.11 编译并运行它。他使用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;
}
4

2 回答 2

3

我猜你和你的朋友正在链接到臭名昭著的不同版本MSVCRT.DLL或可能是其他一些库。

来自 Code::Blocks 常见问题解答:

问:什么 Code::Blocks 不是?

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

因此,“我在 Win7 下使用 Code Blocks 12.11 编译并运行它”的说法并不完全正确;你不能用不是编译器的东西编译。

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

于 2013-11-01T21:03:34.640 回答
1

可能是两个问题之一:打印系统无法处理 long long 或移位运算符无法在 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 位。

于 2013-11-01T20:46:07.383 回答