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:我查看了几个标题相似的帖子,但他们没有解决同样的问题:
答案 0 :(得分:8)
因为printf("%d\n", number);
将打印有符号值,即使参数是无符号的。使用printf("%u\n", number);
可以正确打印无符号值。
答案 1 :(得分:3)
@ UniCell的优秀答案的背景知识。
硬件以完全相同的方式存储int
和unsigned int
。没有不同。如果你开始添加或减去它们,它们将以完全相同的方式溢出和下溢。
0xFFFFFFFF + 1 = 0
0 - 1 = 0xFFFFFFFF
如果我们将结果视为无符号,0xFFFFFFFF
表示4,294,967,295,否则表示-1。它被称为2的补充存储。加法和减法是符号无关的。但乘法和除法不是,所以通常有不同的有符号和无符号机器指令。
这些变量的类型仅为编译器所知,而不是在运行时。 printf
的参数可以是任何类型,传递的变量在运行时不携带类型信息。因此,您必须在格式字符串中告诉printf
如何解释它们。