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。