首页 文章

将负值分配给unsigned int时会发生什么? [重复]

提问于
浏览
13

可能重复:在C中签名为无符号转换 - 它总是安全的吗?

假设我声明了一个unsigned int类型的变量: unsigned int x = -1;

现在-1的二进制补码(假设32位机器)为0xFFFFFFFF . 现在,当我将此值赋给x时,值0x7FFFFFFF是否已分配给x?

如果是这样,则printf(“%d”,x);会打印十进制等效的0x7FFFFFFF,对吧?但是,显然这没有发生,因为打印的值是-1 . 我在这里错过了什么?

编辑:我知道我们可以使用%u格式说明符来打印无符号值 . 但这无助于回答上述问题 .

3 回答

  • 0

    "%d" 格式用于(带符号)int值 . 如果使用无符号值,则可以打印除实际值以外的值 . 使用 "%u" 查看实际值,或 %x 以十六进制查看 .

    在宣言中

    unsigned int x = -1;
    

    表达式 -1 的类型为int,其值为-1 . 初始值设定项将此值从int转换为unsigned int . 有符号到无符号转换的规则表示该值以模数 UINT_MAX + 1 减小,因此 -1 将转换为 UINT_MAX (如果 unsigned int 为32位,则可能为 0xffffffff4294967295 ) .

    您根本无法将负值分配给无符号类型的对象 . 在分配之前,任何此类值都将转换为无符号类型,结果将始终> = 0 .

  • 17

    使用 %u 而不是 %d 来打印无符号值 . 然后你应该看到0xFFFFFFFF .

  • 6

    发生的事情是你首先将值转换为unsigned int,将0xffffffff赋值给x . 然后使用printf(“%d \ n”),您将值转换回signed int,仍然保持0xffffffff的值 . 从而打印-1 .

相关问题