C Unsigned int提供负值?

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

打印%d将读取整数作为带符号的十进制数,而不管其定义的类型如何。

要打印无符号数字,请使用%u

这是因为C处理变量参数的方式。 编译器只是从堆栈中提取值(键入为void*并指向调用堆栈), printf必须从您提供的格式字符串中找出数据包含的内容。

这就是为什么你需要提供格式字符串–C无法通过RTTI或“基类”(例如Java中的Object )来获取通用或预定义的toString

这应该工作:

 unsigned int a; printf("%u\n", a); 

说明:在大多数体系结构中,有符号整数用二进制表示。 在这个系统中,无论是使用int还是unsigned int ,小于2**(N-1) (其中N = sizeof(int) )的正数都以相同的方式表示。 但是,如果unsigned int中的数字大于2**(N-1) ,则表示在二进制补码下的负数有符号数 – 这是printf在您传递"%d"

%d表示printf将该值解释为int(已签名)。 如果它是unsigned int,请使用%u。