为什么下面的c程序的输出是-10

时间:2019-02-12 11:09:29

标签: c

#include <stdio.h>

int main() {
    unsigned int a = -10;
    printf("a=%d\n", a);

    return 0;
}

上面的代码为签名的-10打印int。如果有符号和无符号都在打印-10,那么它们之间有什么区别?

3 个答案:

答案 0 :(得分:6)

您在该代码中实际上有undefined behavior

Firebase.InstanceID.InstanceId.SharedInstance.SetApnsToken(deviceToken, Firebase.InstanceID.ApnsTokenType.Sandbox); 格式适用于纯 signed "%d",格式说明符和参数不匹配会导致UB。

由于int对传递的 real 类型一无所知,因此它只能依赖格式说明符。因此,可能发生的事情是,printf函数只是将值当作纯符号printf对待,并按原样打印它。

答案 1 :(得分:5)

printf不知道您提供的参数类型。使用%d时,您告诉它它是一个 signed int,这是错误的。这是未定义的行为-可能发生任何事情。可能会发生的是,无论如何它只是将内存解释为已签名的int,并且使用unsigned int a=-10;将未签名的int设置为在读为已签名的{{时将被解释为-10的内容。 1}}。有关将负数分配给无符号类型会发生什么的更多信息,请查看this answer

答案 2 :(得分:-1)

您应该使用

printf(“ a = %u \ n”,a);

将“ a”打印为无符号整数