C++ llvm IRBuilder<>;::CreateUDiv/CreateSDiv/CreateExactUDiv

C++ llvm IRBuilder<>;::CreateUDiv/CreateSDiv/CreateExactUDiv,c++,llvm,C++,Llvm,我已经看到,创建部门运营有多种可能性,UDiv/SDiv和ExactUDiv 我推断U和S之间的差异代表未签名和已签名,但这意味着未签名的符号被忽略 还有,确切的意思是什么?结果是一个浮动 还有,NSWAdd和NUWAdd是什么意思?我找不到任何我假设LLVM用于存储整数,在这种情况下,(有符号)负数对于UDiv来说似乎是一个大的无符号数(例如,32位-1的两个补码表示为0xFFFFFFFF)。因此,SDiv(-16,2)==-8,而UDiv(-16,2)==2147483640 所以简而言之:

我已经看到,创建部门运营有多种可能性,UDiv/SDiv和ExactUDiv

我推断U和S之间的差异代表未签名和已签名,但这意味着未签名的符号被忽略

还有,确切的意思是什么?结果是一个浮动

还有,NSWAdd和NUWAdd是什么意思?我找不到任何

我假设LLVM用于存储整数,在这种情况下,(有符号)负数对于UDiv来说似乎是一个大的无符号数(例如,32位
-1
的两个补码表示为
0xFFFFFFFF
)。因此,
SDiv(-16,2)==-8
,而
UDiv(-16,2)==2147483640

所以简而言之:不,符号不仅仅是未签名的被忽略。如果你想解决这个问题,你需要取符号值的绝对值

我可以从中推断,确切的div指令是在已知除法没有余数的情况下。这使得优化更容易


如前所述;新南威尔士州和新南威尔士州的意思是“无符号换行”和“无无无符号换行”,这意味着如果发生换行,将生成一个陷阱值(考虑
UAdd(-1,-1)
,利用上述知识)。

Hi,请您解释一下换行是什么意思,以及新南威尔士州和新南威尔士州的陷阱值是什么?当操作的结果不符合结果类型时,会发生换行。在数学语言中,你说你在模N集合中操作,其中N是1+一个变量可以容纳的最大值(例如,一个字节256)。考虑添加两个字节<代码> < <代码> > <代码> b>代码>,<代码> a=200 < /代码>和<代码> b=150 < /代码>。结果350不能包含在一个字节内(其最大值为255),因此结果将换行。如果我们查看十六进制的值,就会更容易看到这一点:
0xC8+0x96=0x15E
。结果中只保留最低有效位,在这种情况下,
0x5E
,即
200+150=94
。这并不总是可取的,因为结果是意外的。我们期望结果是
350
,但我们得到了
94
。为了能够检测到这个意外的结果,LLVM有算术指令,当结果太大而无法容纳时,它不会包装该值,而是生成一个陷阱值(或毒药值)。然后可以检测到毒药值以引发异常或忽略(这将毒药所有使用该结果的连续计算),无论哪种情况,它都会导致实际的程序错误,而不是默默地发出意外的结果。