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



当源值不能在目标类型中表示时,将整数转换为有符号类型是根据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作为源值。如果sv满足这个条件,或者有时它们是等于模2^n,则它们是全等模2^n

对于具有宽度为8的带符号目标的s = 255255是不可表示的,但-1是,并且v = -1满足具有m = -1的方程。

假设有符号的char=255U,255模2^8仍然是255

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

重新表述规则的一种方法是,转换后的结果将与不可表示的结果模2^n一致。

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

相关内容

  • 没有找到相关文章

最新更新