我想问一下这两种情况有什么区别?
情况1:
unsigned int i;
for(i=10;i>=0;i--)
printf("%d",i);
这将导致无限循环!
情况2:
unsigned int a=-5;
printf("%d",a);
它将在屏幕上打印-5。
现在案例1的原因是i
被声明为unsigned int
因此不能采取负 值,因此将永远是大于0。
但在案例2中,如果a
无法取负值,为什么 -5正在打印 ???
这两种情况有什么区别?
答案 0 :(得分:3)
如果将-ve值分配给unsigned
变量,则无法保存该值,并且该值会添加到UINT_MAX
,最后会得到正值。
请注意,使用错误的说明符打印数据类型会调用未定义的行为
见 C11:7.21.6 p(6):
如果转换规范无效,则行为未定义。 282)
unsigned int a=-5;
printf("%u",a); // use %u to print unsigned
将打印UINT_MAX - 5
。
答案 1 :(得分:3)
差异是您将a
打印为有符号整数。
printf("%d",a);
所以虽然a可能是无符号的,但%d
要求将二进制值打印为有符号值。如果要将其打印为无符号值,请使用
printf("%u",a);
大多数编译器都会警告你对printf的参数使用不兼容 - 所以你可以通过查看所有警告来解决这个问题并修复它。
答案 2 :(得分:2)
i
声明为无符号,因此无法取负值
这是正确的。大多数优化编译器会注意到,从循环中删除条件,并发出警告。
在案例2中,如果a不能取负值,为什么要打印-5?
因为在您的平台上int
和unsigned int
有这样的表示,即将-5
分配给unsigned int
,然后将其传递给printf
,即可保留-5
的表示形式{1}}允许printf
生成"正确"结果
在您的平台上也是如此,但其他平台可能会有所不同。这就是为什么标准认为这种行为未定义的原因(即printf
可以产生任何输出)。如果使用无符号格式说明符进行打印,则会看到一个较大的正数。