超出范围时转换为签名类型行为

Conversion to signed type behavior when out of range

根据cppreference

,当源值无法在目标类型中表示时,将整数转换为有符号类型
  • implementation-defined (until C++20)
  • the unique value of the destination type equal to the source value modulo 2^n where n is the number of bits used to represent the destination type (since C++20)

也在GCC实现定义的行为中指定,有

For conversion to a type of width N, the value is reduced modulo 2^N to be within range of the type; no signal is raised.

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

answer 显示了一种方法,该方法首先反转值并加 1,然后在前面添加一个有符号位。我不确定那是否真的已经完成了。

强调部分的correct/standard解释方法是什么?

Say signed char = 255U, 255 modulo 2^8 is still 255

255 不在类型范围内(8 位有符号整数)。

re-phrase 规则的一种方法是转换后的结果将与不可表示的结果模 2^n 一致。

-513、-257、-1、255、511都是全等模256。全等数中只有-1在有符号类型的可表示范围内。

这些引号均不表示采用原始值、应用模运算并将结果用作转换结果。

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

的(唯一)值
s + m * 2^n = v

对某个整数 m 成立,选择了 s 源值。据说 sv 全等模 2^n 如果它们满足这个条件或者有时它们也 相等模 2^n.

对于带符号目标宽度8s = 255255不可表示,但-1是且v = -1满足等式m = -1.