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
。