繁体   English   中英

为什么由于计算导致的签名溢出仍然是 C++20 中的未定义行为

[英]Why is Signed Overflow due to computation still Undefined Behavior in C++20

我通过这个答案了解到:

由于计算导致的有符号溢出在 C++20 中仍然是未定义的行为,而由于转换导致的有符号溢出在 C++20 中得到了很好的定义(这是为 Pre-C++20定义的实现)。

由于转换导致的有符号溢出的这种变化是因为 C++20 编译器需要使用 2 的补码。

我的问题是

如果编译器需要使用 C++20 中的 2 的补码,那么为什么没有像由于转换导致的有符号溢出一样定义明确的计算导致的有符号溢出?

这就是为什么(如何)在计算溢出和转换溢出之间存在差异。 本质上,为什么这两种溢出处理不同。

如果非二进制补码支持是唯一的问题,则可以将有符号算术溢出定义为具有实现定义的结果,就像已定义转换 integer 一样。 它是UB是有原因的,这些原因没有改变,有符号算术溢出的规则也没有改变。

对于任何 UB,它存在的主要原因有两个:

  • 可移植性。 不同的系统以不同的方式运行,UB 允许以最佳方式支持所有系统。 在这种情况下,正如 Martin Rosenau 在评论中提到的那样,有些系统不会简单地产生“错误”值。
  • 优化。 UB 允许编译器假设它不会发生,这允许基于该假设进行优化。 Jarod42 在评论中显示了一个示例。 另一个例子是UB溢出,可以推断出两个正数相加永远不会产生负数,也不会产生小于任何一个正数的数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM