unsigned int变量何时变为负数

时间:2011-12-06 04:38:48

标签: c

我正在查看现有代码并调试UTC时间,该时间被声明为

unsigned int utc_time;

我每次都能获得一些正整数,我确信我会得到时间。但突然在代码中我得到了一个负值,该变量被声明为无符号整数。

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

4 个答案:

答案 0 :(得分:9)

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

如果将其强制转换为有符号整数,或者只是将值分配给有符号整数,或者甚至错误地将其视为已签名整数,则最终可能会出现负值,例如:

#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位整数系统上。

答案 1 :(得分:3)

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

即。也许你做到了:

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

%d用于signed整数的位置,与用于%u的{​​{1}}相比较。无论如何,如果你向我们展示代码,我们肯定能告诉你。

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

答案 2 :(得分:3)

确保使用

printf("%u", utc_time);

显示它


响应评论%u将varible显示为unsigned int,其中%i%d将varible显示为signed int。

答案 3 :(得分:1)

大多数(所有?)C程序中的负数表示为无符号数的two's complement加1。您的调试器或列出值的程序可能不会将其显示为无符号类型,因此您可以看到它是两个补码。