【发布时间】:2019-10-19 00:01:41
【问题描述】:
我正在尝试了解 gcc -O 选项和 printf 如何更改返回值。
isTmax 下面的代码是我的函数,如果输入是最大的 int 值,则返回 1。
int isTmax(int x);
int main(void)
{
printf("%d\n", isTmax(0x7fffffff));
}
int isTmax(int x)
{
int temp = x + x + 2;
int result = !temp & (!!(~x));
return result;
}
当我在没有 gcc 选项的情况下编译它时它工作得很好。
但是使用 -O 选项,我得到所有整数值的 0。
所以我添加了 printf 来检查值,然后用 -O 选项编译它。
int isTmax(int x)
{
int temp = x + x + 2;
int result = !temp & (!!(~x));
printf("x : %x, temp : %x, !temp : %x\n", x, temp , !temp);
return result;
}
然后它突然又开始工作了。
我想知道为什么返回值会变化。
【问题讨论】:
-
了解UB
-
@pmg 添加,用于签名溢出。在这里使用
0x7fffffff意味着已经处于边缘。 -
具体来说,文档指出signed integer overflows可能会被完全优化掉...
-
您可以使用
return x == INT_MAX;简化此操作,它位于limits.h中。 -
谢谢各位!我以为 printf 改变了一些东西
标签: c gcc return-value