【发布时间】:2017-10-23 00:13:21
【问题描述】:
我的mac环境遇到这个问题,gcc版本如下图:
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin14.5.0
Thread model: posix
代码段来自函数之一。
int someFunction(int x, int n) {
int TMin_n = -(1 << (n-1));
int TMax_n = (1 << (n-1)) - 1;
int a = -2147483648;
printf("%s\n", x == a ? "true" : "false"); // true
printf("%s\n", x <= TMax_n ? "true" : "false"); // false
printf("%s\n", a <= TMax_n ? "true" : "false"); // true
printf("%d %d %d\n", TMin_n, x, TMax_n); // -2147483648 -2147483648 2147483647
return 0;
}
a 等于 x,但为什么它们与 TMax_n 相比有不同的行为?
更新:
此代码段中的所有数据类型均为int。
UPDATE2:
谢谢大家。我刚刚在 ubuntu 机器上尝试了相同的代码,效果很好。它只卡在我的MAC上。似乎是编译器的问题。
【问题讨论】:
-
什么是
x或TMax_n?您的示例不完整。见minimal reproducible example。 -
它不是 GCC,它是 clang(MacOS 上的默认编译器 - 好吧,现在……)。
-
在您编辑之后,您仍然没有显示 x 的类型 - 对这种行为唯一有意义的解释是 x 是 unsigned...
-
无法复制;至少使用
n=32,我得到 3 xtrue。 -
这是 100% 复制/粘贴有问题的代码吗? IE。不是
i32 someFunction(i32 x, i32 n)带有一些自定义类型的 typedef,它们意外地未签名?