【发布时间】:2020-01-15 01:57:45
【问题描述】:
以下代码在 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
【问题讨论】:
-
有符号溢出会导致未定义的行为。编译器完全有权假设它永远不会发生。
-
Possible duplicate。此外,依赖“环绕”的代码充其量是可疑的。
-
@HolyBlackCat 谢谢我不知道,如果您将此作为答案发布,我会接受它
-
@HolyBlackCat 确保您可以将其作为重复项关闭