在this answer中,您可以找到this comment:
严格来说,转换前两个数字的位表示相同并不重要。即使使用1的补码或带符号的幅度表示,(带符号的)-1到无符号的long的转换也将始终产生
ULONG_MAX
。(当然,转换后的位模式相同)
我知道您可以用Two's Compliment以外的其他方式来表示-1
,这是我应该回答的有效补充。但是,在这样的实现中,依靠转换为ULONG_MAX
是否安全?
答案 0 :(得分:5)
是的,这与实际的表示方式无关:
[conv.integral](强调我的意思)
整数类型的prvalue可以转换为另一个的prvalue 整数类型。不受限制的枚举类型的prvalue可以是 转换为整数类型的prvalue。
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(取模2 n 其中
n
是用来表示无符号类型的位数。 [注意:在二进制补码表示中,此转换为 概念上的,位模式没有变化(如果没有 截断)。 —尾注]
答案 1 :(得分:4)
评论者是正确的;从任何其他整数类型到无符号整数类型的转换始终是明确定义的。如果无符号整数类型的范围是0到2 ^ N-1,则转换结果将是原始值模2 ^ N的原始值。即使(例如,在具有一个人的补码或符号幅度表示的系统中)所述以2 ^ N为模的归约需要额外的指令,情况也会如此。