【发布时间】:2011-12-06 04:38:48
【问题描述】:
我正在浏览现有代码,并在调试声明为
的 UTC 时间时unsigned int utc_time;
每次我都可以得到一些正整数,这样我就可以确定我得到了时间。但是突然在代码中我得到了一个声明为无符号整数的变量的负值。
请帮助我了解可能是什么原因。
【问题讨论】:
-
你是如何调试代码的?打印?
-
你能告诉我们有问题的代码吗?
标签: c
我正在浏览现有代码,并在调试声明为
的 UTC 时间时unsigned int utc_time;
每次我都可以得到一些正整数,这样我就可以确定我得到了时间。但是突然在代码中我得到了一个声明为无符号整数的变量的负值。
请帮助我了解可能是什么原因。
【问题讨论】:
标签: c
无符号整数,就其本质而言,永远不会为负数。
如果将其强制转换为有符号整数,或者只是将值分配给有符号整数,甚至错误地将其视为有符号整数,则可能会得到一个负值,例如:
#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 参数。
当它被转换或视为signed 类型时。您可能将unsigned int 打印为int,而unsigned 的位序列将对应于负的signed 值。
即。也许你做到了:
unsigned int utc_time;
...
printf("%d", utc_time);
其中%d 用于signed 整数,而%u 用于unsigned。无论如何,如果您向我们展示代码,我们将能够确定地告诉您。
unsigned 变量中没有正负的概念。
【讨论】:
确保你使用
printf("%u", utc_time);
显示它
作为对评论的回应,%u 将变量显示为无符号整数,而 %i 或 %d 将变量显示为有符号整数。
【讨论】:
大多数(全部?)C 程序中的负数表示为无符号数加一的two's complement。您的调试器或列出值的程序可能没有将其显示为无符号类型,因此您会看到它是二进制补码。
【讨论】: