无法理解 C 中的 unsigned int 类型

标签 c types int unsigned-integer

我开始用 C 编程,但我在理解我得到的一些结果时遇到了问题。我将代码粘贴在这里:

#include <stdio.h>
unsigned int main(void)
{
    unsigned int x = 0;

    printf("%u\n",x-1);
    return 0;
}

终端返回 4.294.967.295,我不明白为什么。我知道这个值是 unsigned int 的最大值,但实际上我期待编译器发出一些警告,告诉我必须使用 int 类型而不是 unsigned int 因为结果是负数。无论如何,有人可以帮助我吗?

最佳答案

当您使用无符号类型时,所有位都用于表示非负值(即 >= 0)。将此视为值环绕,因此当您递减到下限 (0) 以下时,您将环绕到最大值(32 位,2^32 - 1)。

另外,请注意您没有分配一个负值给变量 x,您只是提供了一个从中减去 1 的表达式。即,

x-1

对比

x = x - 1;

尽管您是否会收到关于此的警告可能取决于编译器和设置的警告级别。

关于无法理解 C 中的 unsigned int 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11903028/

相关文章:

c - fscanf 总线错误 : 10 when switching from Snow Leopard to Lion

c - scanf_s() 不返回每个输入

c++ - 使用 gstreamer 时出现 Eclipse 无效参数错误

c - 将可变长度字符串数组读取为整数

python - OS X UDP 发送错误 : 55 No buffer space available

sql-server - 关于 DateTime 类型的意外错误

c - C中的斐波那契数列产生负数?

c# - 在 int 和 string 中装箱和拆箱

c - 如何使用宏中定义的字符串/将其转换为整数?

当数组值为零而不是空时,c 循环停止