【发布时间】:2017-06-20 13:04:58
【问题描述】:
我在下面的代码中遇到了这个意外的输出,我在其中验证了 short 和 int 类型的无符号形式的最大值(以十进制形式表示),当它们的所有位都设置为 1 时。
#include <stdio.h>
int main()
{
unsigned int n1 = 0xFFFFFFFF;
unsigned short n2 = 0xFFFF;
printf("\nMax int = %+d", n1);
printf("\nMax short = %+d", n2);
return 0;
}
我得到的输出是(使用 Visual Studio 2017 C/C++ 编译器编译):
Max int = -1
Max short = +65535
按照 unsigned short 的思路,我预计 unsigned int 的最大值是 +4294967295。为什么不是这样?
【问题讨论】:
-
说真的,在推断语言疯狂之前检查您的调试技术是否正确。
-
%d用于int,您正在寻找%u。也就是说,最大无符号总是(unsigned)-1。 -
您的代码调用了未定义的行为。一切皆有可能。检查您的硬盘驱动器,它可能已被擦除。在询问之前启用并修复编译器警告!
-
@Downvoters,请记住,这个问题写得很好并且具有可编译的代码,并且 OP 已经记录了预期和实际输出。请不要以明显的主观理由投反对票。
-
@cdarke:
sizeof(type)没有说明type的宽度。sizeof(int) == 1完全有效。即使使用CHAR_BIT == 8,sizeof(uint64_t)也是8,而不是16(实际上,这个值是不可能的)。
标签: c