#include <stdio.h>
int main() {
unsigned int a = -10;
printf("a=%d\n", a);
return 0;
}
上面的代码为签名的-10
打印int
。如果有符号和无符号都在打印-10
,那么它们之间有什么区别?
答案 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”打印为无符号整数