C中unsigned int的行为

时间:2014-11-21 07:12:08

标签: c int unsigned

C中 unsigned int 的大小为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:我查看了几个标题相似的帖子,但他们没有解决同样的问题:

signed vs unsigned int in C

Unexpected results on difference of unsigned ints

2 个答案:

答案 0 :(得分:8)

因为printf("%d\n", number);将打印有符号值,即使参数是无符号的。使用printf("%u\n", number);可以正确打印无符号值。

答案 1 :(得分:3)

@ UniCell的优秀答案的背景知识。

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

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

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

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