use*_*570 7 c++ signed overflow type-conversion c++20
通过这个回答我才知道:
由于计算而导致的有符号溢出在 C++20 中仍然是未定义的行为,而由于转换而导致的有符号溢出在 C++20 中得到了明确定义(这是为 Pre-C++20定义的实现)。
由于转换导致的有符号溢出的变化是因为 C++20 编译器要求使用 2 的补码。
我的问题是:
如果编译器需要使用 C++20 中的 2 的补码,那么为什么由于计算而导致的有符号溢出不像由于转换而导致的有符号溢出那样被明确定义?
也就是说,计算溢出和转换溢出之间为什么(如何)存在差异。从本质上讲,为什么这两种溢出的处理方式不同。
如果非补码支持是唯一的问题,那么有符号算术溢出可以被定义为具有实现定义的结果,就像定义转换整数一样。为什么它是 UB 是有原因的,这些原因没有改变,有符号算术溢出的规则也没有改变。
对于任何 UB,其存在本质上有两个主要原因: