【问题标题】:Unexpected unsigned integer behavior意外的无符号整数行为
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用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 处。除其他原因外,这会使用默认设置 line buffered 刷新 stdouts 缓冲区。

    【讨论】:

    • (unsigned)-1 和 (unsigned short)-1 用法是否对应于强制转换?
    • “对应”?在要强制转换的操作数前面的括号中写入类型 is C 中的强制转换运算符...
    • 我的错...无法识别 -1 正在被施放
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    相关资源
    最近更新 更多