下面的代码在 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
最佳答案
CurAnimIndex++
The CurAnimIndex is an int32 and has the value 2147483647 (max int). I would expect it to enter the branch since the value of CurAnimIndex after the increment should be a negative number
2147483647 是一个正数。为什么你会认为增加正数会产生负数?这在正常算术中不会发生。编译器知道这一点并根据该知识进行优化。如果初始值为CurAnimIndex
已被证明至少为-1,则检查CurAnimIndex < 0
已知总是错误的并且可以优化掉。
也许您的期望与操作溢出最大可表示值这一事实有关。这种期望是错误的,因为签名溢出不能保证有这种行为。事实上,签名溢出并不能保证有任何特定的行为。程序的行为未定义。
正确的方法是首先检查该数字是否等于最大可表示值,如果不等于则仅增加。
关于c++ - Linux 上未采用分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59737589/