C中unsigned int的行为

C中无符号整数的大小为0 to 65,535 or 0 to 4,294,967,295

我在C中测试了以下代码:

 unsigned int number = 0; number -= 300; printf("%d\n", number); 

输出:-300

我记得如果unsigned int变量的值低于0,它应该回绕并且我期望输出类似于4294966996 。 但是从控制台打印的输出是-300

我在C ++中测试了类似的语句,它确实给了我4294966996

我的问题是:为什么输出-300尽管它是一个unsigned int


PS:我查看过几个标题相似的post,但他们没有解决同样的问题:

在C中签名vs unsigned int

无符号整数差异的意外结果

因为printf("%d\n", number); 即使参数未签名,也会打印带符号的值。 使用printf("%u\n", number); 要正确打印无符号值。

只是@ UniCell的优秀答案背景。

硬件以完全相同的方式存储intunsigned int 。 没有不同。 如果您开始添加或减去它们,它们将以完全相同的方式溢出和下溢。

 0xFFFFFFFF + 1 = 0 0 - 1 = 0xFFFFFFFF 

如果我们将结果视为无符号,则0xFFFFFFFF表示4,294,967,295,否则表示-1。 它被称为2的补充存储。 加法和减法是符号无关的。 但乘法和除法不是,所以通常有不同的有符号和无符号机器指令。

这些变量的类型仅为编译器所知,而不是在运行时。 printf的参数可以是任何类型,传递的变量在运行时不携带类型信息。 所以你必须告诉printf格式字符串如何解释它们。