我和我的朋友刚刚遇到一个非常奇怪的长距离问题。 所以基本上,我的电脑有一个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;
}
答案 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位定义移位运算符。