首页 文章

从'(signed) -1'转换为'unsigned long'标准化了吗? [重复]

提问于
浏览
2

这个问题在这里已有答案:

this answer中,您可以找到this comment

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

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

2 回答

  • 5

    是的,无论实际表示如何,都可以保证:

    [conv.integral](强调我的)

    整数类型的prvalue可以转换为另一个整数类型的prvalue . 可以将未范围的枚举类型的prvalue转换为整数类型的prvalue . 如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2n,其中n是用于表示无符号类型的位数) . [注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断) . - 结束说明]

  • 4

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

相关问题