在不同情况下使用unsigned int?

时间:2014-07-11 13:15:00

标签: c unsigned-integer

我想问一下这两种情况有什么区别?

情况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正在打印 ???

这两种情况有什么区别?

3 个答案:

答案 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?

因为在您的平台上intunsigned int有这样的表示,即将-5分配给unsigned int,然后将其传递给printf,即可保留-5的表示形式{1}}允许printf生成"正确"结果

在您的平台上也是如此,但其他平台可能会有所不同。这就是为什么标准认为这种行为未定义的原因(即printf可以产生任何输出)。如果使用无符号格式说明符进行打印,则会看到一个较大的正数。