This question already has answers here:
Do C99 signed integer types defined in stdint.h exhibit well-defined behaviour in case of an overflow?
(2个答案)
去年关闭。
下面的代码在Windows上可以正常工作,但是当使用Clang 6.0构建并在Ubuntu服务器上运行时,它不起作用。 CurAnimIndex是一个int32,其值2147483647(最大int)。我希望它进入分支,因为增量后的CurAnimIndex值应该为负数,但是不是。
(2个答案)
去年关闭。
下面的代码在Windows上可以正常工作,但是当使用Clang 6.0构建并在Ubuntu服务器上运行时,它不起作用。 CurAnimIndex是一个int32,其值2147483647(最大int)。我希望它进入分支,因为增量后的CurAnimIndex值应该为负数,但是不是。
CurAnimIndex++;
if (CurAnimIndex >= AnimSelectorDatas.Num() || CurAnimIndex < 0)
{
CurAnimIndex = 0;
}
0x000000000411a12f mov 0x0(%r13),%eax
0x000000000411a133 lea 0x1(%rax),%ecx
0x000000000411a136 movslq 0x10(%r13),%r15
0x000000000411a13a xor %ebp,%ebp
0x000000000411a13c cmp %r15d,%ecx
0x000000000411a13f cmovge %ebp,%ecx
0x000000000411a142 cmp $0xffffffff,%eax
0x000000000411a145 cmovl %ebp,%ecx
0x000000000411a148 mov %ecx,0x0(%r13)
0x000000000411a14c mov 0x8(%r13),%r12 enter code here
最佳答案
2147483647是一个正数。您为什么期望递增正数会产生负数?正常算术中不会发生这种情况。编译器知道这一点,并根据该知识进行优化。如果CurAnimIndex
的初始值已被证明至少为-1,则已知CurAnimIndex < 0
校验始终为假,可以对其进行优化。
也许您的期望与操作超出最大可表示值的事实有关。这种期望被放错了位置,因为不能保证签名溢出会具有这种行为。实际上,不能保证签名溢出会具有任何特定行为。该程序的行为是不确定的。
正确的方法是先检查该数字是否等于最大可表示值,如果不等于则仅递增。
关于c++ - Linux上未使用分支,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59737589/
10-12 20:40