意外的无符号整数行为

时间:2017-06-20 13:04:58

标签: c

我在下面的代码中遇到了这个意外的输出,当我将所有位都设置为1时,我正在验证short和int类型的无符号形式的最大值(以十进制形式表示)。

#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。为什么不是这样呢?

2 个答案:

答案 0 :(得分:8)

您需要使用%u作为unsigned类型的格式说明符。

答案 1 :(得分:3)

使用printf(),格式字符串中的转换必须与参数类型匹配,否则行为未定义%d适用于int

尝试使用最大值:

#include <stdio.h>

int main()
{
    printf("Max unsigned int = %u\n", (unsigned)-1);
    printf("Max unsigned short = %hu\n", (unsigned short)-1);
    return 0;
}

附注:

  • 任何无符号类型的最大值为-1强制转换为该类型。
  • 将换行符放在行的 end 上。除其他原因外,这会刷新stdout缓冲区,默认设置为行缓冲