1

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

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

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

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

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

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

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

4

2 回答 2

5

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

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

s + m * 2^n = v

选择了一些m带有s源值的整数。如果它们满足这个条件,或者有时它们是相等的模,则据说sv模全等2^n的。2^n

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

于 2022-02-25T15:09:44.093 回答
2

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

255 isn't within range of the type (of 8 bit signed integer).

One way to re-phrase the rule is that the converted result will be congruent with the unrepresentable result modulo 2^n.

-513, -257, -1, 255, 511 are all congruent modulo 256. Of the congruent numbers, only -1 is within the representable range of the signed type.

于 2022-02-25T15:06:27.380 回答