我有一个无符号整数,但是当我使用%d打印出来时,有时会出现负值吗?
答案 0 :(得分:26)
打印%d
将读取整数作为带符号的十进制数,无论其定义的类型如何。
要打印无符号数字,请使用%u
。
这是因为C处理变量参数的方式。编译器只是从堆栈中提取值(键入为void*
并指向调用堆栈),printf
必须从您提供的格式字符串中找出数据包含的内容。
这就是你需要提供格式字符串的原因 - 例如,C无法使用RTTI或'基类'(在Java中为Object
)来获得通用或预定义的{{ 1}}来自。
答案 1 :(得分:10)
这应该有效:
unsigned int a;
printf("%u\n", a);
说明:在大多数体系结构中,有符号整数表示在two's complement中。在此系统中,无论您使用2**(N-1)
还是N = sizeof(int)
,小于int
(其中unsigned int
)的正数都以相同的方式表示。但是,如果unsigned int中的数字大于2**(N-1)
,则表示在两个补码下的负数有符号数 - 这是printf
在您传递"%d"
时给出的数字。 / p>
答案 2 :(得分:4)
%d表示printf将该值解释为int(已签名)。如果它是unsigned int,请使用%u。