【问题标题】:Use of unsigned int in different cases? [duplicate]在不同情况下使用 unsigned int? [复制]
【发布时间】:2014-07-11 13:14:59
【问题描述】:

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

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

这两种情况有什么区别?

【问题讨论】:

标签: c unsigned-integer


【解决方案1】:

不同之处是您将a 打印为有符号整数。

printf("%d",a);

所以虽然 a 可能是无符号的,但 %d 要求将二进制值打印为有符号值。如果要将其打印为无符号值,请使用

printf("%u",a);

大多数编译器会警告您对 printf 参数的不兼容使用——因此您可能会通过查看所有警告并修复它来发现这一点。

【讨论】:

    【解决方案2】:

    将 -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的值。

    【讨论】:

    • 它是 UINT_MAX 而不是 UMAX_INT
    • @mch;谢谢你提醒我。
    【解决方案3】:

    i 被声明为无符号,因此它不能取负值

    没错。大多数优化编译器会注意到这一点,从循环中删除条件,并发出警告。

    在情况2中,如果a不能取负值,为什么要打印-5?

    因为在您的平台上,intunsigned int 具有这样的表示形式,即将 -5 分配给 unsigned int,然后将其传递给 printf 以让 printf 保留 -5 的表示形式产生“正确”的结果。

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

    【讨论】:

    • 请问,为什么第一种情况会出现死循环?
    • @Jerky 因为无符号数不能为负数,所以无论i 的值如何,条件i >= 0 都保持为真。
    • 谢谢先生,我知道了!
    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多