C语言中无符号int的行为

C语言中无符号int的行为,c,int,unsigned,C,Int,Unsigned,C中无符号int的大小为0到65535或0到4294967295 我在C中使用以下代码进行了测试: unsigned int number = 0; number -= 300; printf("%d\n", number); 输出:-300 我记得,如果unsigned int变量的值低于0,它应该是环绕的,我希望输出类似于4294966996。但是,从控制台打印的输出是-300 我在C++中测试了类似的语句,它给了我 4294966996代码/> > < /p> 我的问题是:为什么输出-3

C中无符号int的大小为
0到65535或0到4294967295

我在C中使用以下代码进行了测试:

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

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

我在C++中测试了类似的语句,它给了我<代码> 4294966996代码/> > < /p> 我的问题是:为什么输出

-300
,尽管它是一个
无符号int


附言:我看过几篇标题类似的文章,但它们并不是针对同一个问题:


因为
printf(“%d\n”,数字)
将打印有符号的值,即使参数是无符号的。使用
printf(“%u\n”,数字),以便正确打印未签名的值。

对于@UniCell的出色回答,只需要一点背景知识

硬件以完全相同的方式存储
int
无符号int
。没有区别。如果你开始增加或减少它们,它们将以完全相同的方式溢出和下溢

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

如果将结果视为无符号,<代码> 0xFFFFFFF意味着4294967295,否则它意味着- 1。它被称为2的补码存储。加减法是符号不可知的。但是乘法和除法不是,所以通常有不同的有符号和无符号机器指令


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

printf
是一个哑函数。您必须确保您正在传递它期望的类型!请记住,使用有符号整数格式字符串打印无符号整数是未定义的行为。最后一个问题:如果我使用%d打印它,它会在打印前隐式地将其转换为有符号整数吗?我不认为有关于如何实现
printf
的要求,它可能只是用一个
char*
给你的参数加上别名,然后把字节解析成一个合适的c字符串(基于你的格式字符串)。这是没有保证的,但在实践中,情况总是这样。我的实践包括英特尔196、英飞凌C166、飞思卡尔HCS12、瑞萨、x86、x86_64和ARM的体系结构。