这个问题在这里已有答案:
在this answer中,您可以找到this comment:
严格地说,在转换之前两个数字的位表示是相同的并不重要 . 即使使用1的补码或带符号的幅度表示,(带符号)-1到无符号长的转换也将始终产生ULONG_MAX . (转换后的位模式将相同) .
我知道你可以用其他方式代表 -1
,这是一个有效的补充,应该在我的答案中 . 但是,在这样的实现中,依赖于转换为 ULONG_MAX
是否安全?
这个问题在这里已有答案:
在this answer中,您可以找到this comment:
严格地说,在转换之前两个数字的位表示是相同的并不重要 . 即使使用1的补码或带符号的幅度表示,(带符号)-1到无符号长的转换也将始终产生ULONG_MAX . (转换后的位模式将相同) .
我知道你可以用其他方式代表 -1
,这是一个有效的补充,应该在我的答案中 . 但是,在这样的实现中,依赖于转换为 ULONG_MAX
是否安全?
2 回答
是的,无论实际表示如何,都可以保证:
[conv.integral](强调我的)
评论者是正确的;从任何其他整数类型转换为无符号整数类型始终是明确定义的 . 如果无符号整数类型的范围是0到2 ^ N - 1,那么转换的结果将是以模2 ^ N减小的原始值 . 即使(如在具有一个补码或符号幅度表示的系统中)所述减少模2 ^ N需要额外指令,情况也是如此 .