超出范围时转换为签名类型行为
Conversion to signed type behavior when out of range
,当源值无法在目标类型中表示时,将整数转换为有符号类型
- 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
源值。据说 s
和 v
是 全等模 2^n
如果它们满足这个条件或者有时它们也 相等模 2^n
.
对于带符号目标宽度8
的s = 255
,255
不可表示,但-1
是且v = -1
满足等式m = -1
.
- 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
源值。据说 s
和 v
是 全等模 2^n
如果它们满足这个条件或者有时它们也 相等模 2^n
.
对于带符号目标宽度8
的s = 255
,255
不可表示,但-1
是且v = -1
满足等式m = -1
.