Linux上没有该分支

问题描述 投票:1回答:1

下面的代码在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
c++ linux c++14 clang++
1个回答
0
投票
CurAnimIndex++

CurAnimIndex是一个int32,其值2147483647(最大int)。我希望它进入分支,因为增量后的CurAnimIndex值应该为负数

2147483647是一个正数。您为什么期望递增正数会产生负数?正常算术中不会发生这种情况。编译器知道这一点,并根据该知识进行优化。

也许您的期望与操作超出最大可表示值的事实有关。这种期望是错误的,因为不能保证签名溢出会具有这种行为。实际上,不能保证签名溢出具有任何特定行为。该程序的行为是不确定的。

© www.soinside.com 2019 - 2024. All rights reserved.