我正在查看现有代码并调试UTC时间,该时间被声明为
unsigned int utc_time;
我每次都能获得一些正整数,我确信我会得到时间。但突然在代码中我得到了一个负值,该变量被声明为无符号整数。
请帮助我理解可能是什么原因。
答案 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。您的调试器或列出值的程序可能不会将其显示为无符号类型,因此您可以看到它是两个补码。