【问题标题】:why (unsigned int) produces negative numbers in the output in C [duplicate]为什么(无符号整数)在C的输出中产生负数[重复]
【发布时间】:2016-12-08 16:18:10
【问题描述】:

我发现在下面的代码中输出总是带有负号,尽管我指出变量x 的位是用于初始化语句中的无符号整数。

为什么~x 会产生一个负符号数,而没有为要首先反映的数字符号分配位?

#include <stdio.h>
void main() {
    unsigned int x = 11;
    printf("not x=%d", ~x);
}

【问题讨论】:

    标签: c unsigned-integer


    【解决方案1】:

    这种行为取决于平台,但基本答案是printf 不知道您传递的东西被声明为无符号。这只是一个值。如果您使用%d 格式,该值将被解释为有符号整数。如果您使用%u,它将被解释为无符号。在使用二进制补码表示的处理器上,设置了最高有效位的值是负数。由于~11 设置了该位,因此显示为负数。

    【讨论】:

    • 行为是实现定义的,它是由 7.21.6.1.p9 未定义
    • @Andy Schweig 你说位的表示改变了结果,并且通过指示不同的输出公式(%d,%u)而改变了?如果我错了,请纠正我..
    【解决方案2】:

    这是关于 printf 对您传递的参数的解释。

    unsigned int x = 11;
    printf("not x=%d", ~x);
    

    在函数调用期间,默认参数提升会将 ~x 作为 unsigned int 类型传递给 printf。由于 printf 签名中的 va_args 应用了默认参数提升。

    此外,整数提升 用于计算 ~x -- 来自6.5.3.3 Unary arithmetic operators:

    ~ 运算符的结果是它的按位补码 (提升)操作数(即,结果中的每一位都被设置当且仅 如果未设置转换后的操作数中的相应位)。这 对操作数执行整数提升,结果有 提升的类型。如果提升的类型是无符号类型,则 表达式 ~E 等价于可表示的最大值 键入减 E。

    所以你传递了一个无符号整数,但是 printf 会将它转换为 int,因为 %d 期望找到一个 int。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多