将“(有符号) -1”转换为“无符号长整型”是否标准化?

3
这个答案中,你可以找到这个评论

严格来说,在转换之前两个数字的位表示相同并不重要。即使使用1的补码或符号幅度表示,将(有符号)-1转换为无符号长整型始终会导致ULONG_MAX(当然,在转换后位模式将保持不变。)

我知道你可以用其他方式表示-1,这是一个有效的补充,应该包含在我的答案中。但是,在这种实现中,依赖于转换为ULONG_MAX是否安全?

2个回答

5

无论实际表示如何,这都是有保证的:

[conv.integral](我强调)

整数类型的 prvalue 可以转换为另一种整数类型的 prvalue。未作用域的枚举类型的 prvalue 可以转换为整数类型的 prvalue。

如果目标类型是无符号的,则结果值是源整数对 2n 取模后最小的无符号整数(其中 n 是用于表示无符号类型的位数)。[注:在二补码表示中,该转换是概念性的,并且没有比特模式的变化(如果没有截断)。—end note]


4

评论者是正确的;从任何其他整数类型转换为无符号整数类型始终是明确定义的。如果无符号整数类型的范围是0到2^N-1,则转换的结果将是原始值对2^N取模后的余数。即使(如具有补码或符号大小表示的系统)该取模2^N需要额外的指令,这也是适用的。


1
还有一个标准链接:http://eel.is/c++draft/conv.integral#2 - jcai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接