当源值不能在目标类型中表示时,将整数转换为有符号类型是根据cppreference
- 实现定义(直到C++20(
- 目标类型的唯一值等于源值模2^n,其中n是用于表示目标类型的位数(由于C++20(
在GCC实现定义的行为中也指定了
对于转换为宽度为N的类型,该值是模2^N缩小到该类型的范围内;则不产生任何信号。
我想他们也在说同样的话。我的问题是,缩减/模块化的结果是否仍然可能超出目标签名类型的范围?假设signed char c = 255
,255模2^8仍然是255,不变。这个模块化的结果如何适应目的地类型?
这个答案显示了一种方法,首先将值反转并加1,然后预加一个有符号的位。我不确定是否真的这样做了。
解释强调部分的正确/标准方式是什么?
这两个引号都不意味着取原始值,应用模运算,并将结果用作转换结果。
相反,他们的意思是说,在目标类型中可表示的所有值v
中,数学等式
s + m * 2^n = v
对于某个整数m
成立,选择s
作为源值。如果s
和v
满足这个条件,或者有时它们是等于模2^n
,则它们是全等模2^n
。
对于具有宽度为8
的带符号目标的s = 255
,255
是不可表示的,但-1
是,并且v = -1
满足具有m = -1
的方程。
假设有符号的char=255U,255模2^8仍然是255
255不在类型(8位带符号整数(的范围内。
重新表述规则的一种方法是,转换后的结果将与不可表示的结果模2^n一致。
-513、-257、-255511都是模256全等的。在全等数中,只有-1在有符号类型的可表示范围内。