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的优秀答案背景。
硬件以完全相同的方式存储int
和unsigned int
。 没有不同。 如果您开始添加或减去它们,它们将以完全相同的方式溢出和下溢。
0xFFFFFFFF + 1 = 0 0 - 1 = 0xFFFFFFFF
如果我们将结果视为无符号,则0xFFFFFFFF
表示4,294,967,295,否则表示-1。 它被称为2的补充存储。 加法和减法是符号无关的。 但乘法和除法不是,所以通常有不同的有符号和无符号机器指令。
这些变量的类型仅为编译器所知,而不是在运行时。 printf
的参数可以是任何类型,传递的变量在运行时不携带类型信息。 所以你必须告诉printf
格式字符串如何解释它们。