当我在下面运行程序时,它会输出 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);
}
当我在下面运行程序时,它会输出 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
which is forint
打印一个unsigned
) - 所以你可以期待任何事情发生。
为什么是无限循环?因为 anunsigned int
总是>= 0
。
无符号整数的概念是什么?
这是一个……无符号整数。一个非负的整数。
您使用%d
,因此 printf 将值解释为带符号的。与无符号的零 (>=0) 的比较始终为真。
因此,虽然值从 10 到 0,但输出正常(109876543210)。之后,该值变为巨大的正数(最大值,对于 32bit int 它是0xFFFFFFFF
)。与 0 的比较为真,因此循环继续。但在printf
0xFFFFFFFF
生产-1
自用%d
。然后循环继续到0xFFFFFFFE
它-2
仍然>= 0
是无符号的。
使用%u
.
printf
不知道你给它的变量的类型,它得到的只是值(位本身)。您必须告诉它如何解释该值,并告诉它如何将%d
其解释为有符号整数。
您正在使用带有 printf() 的“%d”,它是有符号整数的格式说明符。
您应该在 printf 中%u
用作格式说明符,否则该值将转换为int
.
有符号整数(我们将使用 16 位)范围从 -32768 到 32767(0x8000 到 0x7FFF),而无符号整数范围从 0 到 65535(0x0000 到 0xFFFF)。所以无符号整数不能有负值,这就是你的循环永远不会终止的原因。但是,您已告诉打印程序将输出格式化为已签名( %d
),以便您在输出中看到格式化为负值的数字。在某种程度上,计算机中的所有内容都只是需要解释的一串位,您的代码示例使用相同位模式的两种不同解释......您的无符号整数。
该声明unsigned integer
指示编译器对变量使用无符号操作。例如,>>
运算符对无符号整数和有符号整数有不同的行为(具体来说,它是否应该保留符号位)。
要打印无符号整数,您应该使用%u
格式。