从“(有符号)-1”到“无符号长”的转换是否标准化?

时间:2018-07-11 20:55:28

标签: c++ type-conversion specifications unsigned signed

this answer中,您可以找到this comment

  

严格来说,转换前两个数字的位表示相同并不重要。即使使用1的补码或带符号的幅度表示,(带符号的)-1到无符号的long的转换也将始终产生ULONG_MAX(当然,转换后的位模式相同)

我知道您可以用Two's Compliment以外的其他方式来表示-1,这是我应该回答的有效补充。但是,在这样的实现中,依靠转换为ULONG_MAX是否安全?

2 个答案:

答案 0 :(得分:5)

是的,这与实际的表示方式无关:

[conv.integral](强调我的意思)

  

整数类型的prvalue可以转换为另一个的prvalue   整数类型。不受限制的枚举类型的prvalue可以是   转换为整数类型的prvalue。

     

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(取模2 n   其中n是用来表示无符号类型的位数。   [注意:在二进制补码表示中,此转换为   概念上的,位模式没有变化(如果没有   截断)。 —尾注]

答案 1 :(得分:4)

评论者是正确的;从任何其他整数类型到无符号整数类型的转换始终是明确定义的。如果无符号整数类型的范围是0到2 ^ N-1,则转换结果将是原始值模2 ^ N的原始值。即使(例如,在具有一个人的补码或符号幅度表示的系统中)所述以2 ^ N为模的归约需要额外的指令,情况也会如此。