C Unsigned int提供负值?

时间:2009-12-02 09:33:30

标签: c int unsigned

我有一个无符号整数,但是当我使用%d打印出来时,有时会出现负值吗?

3 个答案:

答案 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。