【问题标题】:When will an unsigned int variable becomes negativeunsigned int 变量何时变为负数
【发布时间】:2011-12-06 04:38:48
【问题描述】:

我正在浏览现有代码,并在调试声明为

的 UTC 时间时

unsigned int utc_time;

每次我都可以得到一些正整数,这样我就可以确定我得到了时间。但是突然在代码中我得到了一个声明为无符号整数的变量的负值。

请帮助我了解可能是什么原因。

【问题讨论】:

  • 你是如何调试代码的?打印?
  • 你能告诉我们有问题的代码吗?

标签: c


【解决方案1】:

无符号整数,就其本质而言,永远不会为负数。

如果将其强制转换为有符号整数,或者只是将值分配给有符号整数,甚至错误地将其视为有符号整数,则可能会得到一个负值,例如:

#include <stdio.h>

int main (void) {
    unsigned int u = 3333333333u;
    printf ("unsigned = %u, signed = %d\n", u, u);
    return 0;
}

哪个输出:

unsigned = 3333333333, signed = -961633963

在我的 32 位整数系统上。

【讨论】:

  • 或者如果您将其视为已签名,例如使用printf"%d" 格式打印它,这需要一个(签名的)int 参数。
  • @HunterMcMillen:这个例子是在 Keith 发表评论时编辑的,时机很好。
【解决方案2】:

当它被转换或视为signed 类型时。您可能将unsigned int 打印为int,而unsigned 的位序列将对应于负的signed 值。

即。也许你做到了:

unsigned int utc_time;
...
printf("%d", utc_time);

其中%d 用于signed 整数,而%u 用于unsigned。无论如何,如果您向我们展示代码,我们将能够确定地告诉您。

unsigned 变量中没有正负的概念。

【讨论】:

    【解决方案3】:

    确保你使用

    printf("%u", utc_time);
    

    显示它


    作为对评论的回应,%u 将变量显示为无符号整数,而 %i%d 将变量显示为有符号整数。

    【讨论】:

    • 0pts - 添加对 %u 的作用以及为什么需要投票的说明。
    • 感谢@Will 的反馈。
    【解决方案4】:

    大多数(全部?)C 程序中的负数表示为无符号数加一的two's complement。您的调试器或列出值的程序可能没有将其显示为无符号类型,因此您会看到它是二进制补码。

    【讨论】:

    • 当然是大多数,但不是,不是全部 :-)
    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多