超出范围时转换为有符号类型行为

Mas*_*uue 1 c++ implicit-conversion c++20 implementation-defined-behavior

当源值无法在目标类型中表示时,根据cppreference将整数转换为有符号类型

  • 实现定义(C++20 之前)
  • 目标类型的唯一值等于源值模 2^n ,其中 n 是用于表示目标类型的位数 (C++20 起)

GCC实现定义的行为中还指定了

为了转换为宽度为 N 的类型,该值会以 2^N 为模减少到该类型的范围内;没有发出任何信号。

我猜也有人说同样的话。我的问题是减少/模数结果是否仍然可能超出目标签名类型的范围?比如说signed char c = 255,255 模 2^8 仍然是 255,没有变化。这个模数结果如何适合目标类型?

这个答案展示了一种方法,首先将值反转并加 1,然后在前面添加一个有符号位。我不确定这是否是实际所做的。

解释强调部分的正确/标准方法是什么?

use*_*522 5

这些引号都不是说采用原始值、应用模运算并将结果用作转换结果。

相反,它们的意思是说,v在目标类型中可表示的所有值中,数学等式的(唯一)值

s + m * 2^n = v
Run Code Online (Sandbox Code Playgroud)

对于某个整数 成立m,并s选择源值。s如果和满足这个条件,则称v模全等2^n,或者有时也称模 相等2^n

对于s = 255带符号的宽度为 的目标8255不可表示,但-1是 且v = -1满足方程m = -1