C语言中无符号int的行为
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
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的体系结构。