C中的无符号整数

当我运行下面的程序时,它输出像109876543210-1-2-3-4-5-6-78-9-10-11-12-and s0 on。 为什么这样? 无符号整数的概念是什么?

main () { unsigned int i; for (i = 10; i >= 0; i--) printf ("%d", i); } 

无符号整数总是非负的,大于或等于0.当您在无符号整数类型中从0减去1时,最终得到MAX_INT。

因此,您的for循环永远不会终止。

但是,如果要打印无符号值而不是有符号值,则需要在printf中使用“%u”而不是“%d”。

%d格式字符串将替换值视为已签名的int

为什么这样?

因为你的程序有一个未定义的行为(使用%d ,这是为了打印一个unsigned int ) – 所以你可以期待任何事情发生。

为什么无限循环? 因为unsigned int总是>= 0

无符号整数的概念是什么?

这是一个…… 无符号整数。 一个非负数的整数。

您使用%d ,因此printf将值解释为signed。 与无符号的零(> = 0)的比较始终为真。

因此,虽然值从10到0,但输出正常(109876543210)。 之后,该值变为巨大的正值(最大值,对于32位int,它是0xFFFFFFFF )。 与0的比较是正确的,因此循环继续。 但是在printf 0xFFFFFFFF产生-1因为使用了%d 。 然后循环继续到0xFFFFFFFE ,这是-2但仍然>= 0为无符号。

使用%u

printf无法知道你给它的变量的类型,它得到的只是值(位本身)。 您必须告诉它如何解释该值,并使用%d告诉它将其解释为有符号整数。

您正在使用printf()的“%d”,它是有符号整数的格式说明符。

声明unsigned integer指示编译器对变量使用无符号运算。 例如, >>运算符对无符号整数与有符号整数的行为不同(具体来说,它是否应该保留符号位)。

要打印无符号整数,应使用%u格式。

有符号整数(我们将使用16位)范围从-32768到32767(0x8000到0x7FFF), 而无符号整数范围从0到65535(0x0000到0xFFFF)。 所以无符号整数不能有负值,这就是你的循环永远不会终止的原因。 但是,您已告知打印程序将输出格式化签名%d ),以便您在输出中看到格式为负值的数字。 在某种程度上,计算机中的所有内容只是需要解释的一串位,您的代码示例使用相同位模式的两种不同解释…您的unsigned int。

您应该使用%u作为printf中的格式说明符 ,否则将值转换为int