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