我已经看到创建分区操作有各种各样的可能性,UDiv / SDiv和ExactUDiv,
我推断U和S之间的区别代表无符号和有符号,但这意味着无符号会忽略符号吗?
另外,究竟什么意思?结果是浮动?
此外,NSWAdd和NUWAdd是什么意思?我找不到任何documentation
答案 0 :(得分:3)
我假设LLVM使用two's complement来存储整数,在这种情况下,(带符号)负数看起来像是UDiv的大型无符号数(例如,32位-1
的二进制补码表示是0xFFFFFFFF
)。因此SDiv(-16, 2) == -8
而UDiv(-16, 2) == 2147483640
。
简而言之:不,这个符号不会因为无符号而被忽略。如果你想要,你需要通过获取有符号值的绝对值来解决它。
我可以从here推断出,当知道除法没有余数时,似乎确切的div指令。这使得更容易优化。
更多内容如here所述; NSW和NUW表示“No Signed Wrap”和“No Unsigned Wrap”,这意味着如果发生包装,则会生成陷阱值(请考虑UAdd(-1, -1)
从上面获得的知识)。