C 意外的无符号整数行为

C 意外的无符号整数行为,c,C,我在下面的代码中遇到了这个意外的输出,我在验证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); re

我在下面的代码中遇到了这个意外的输出,我在验证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;
}
根据unsigned short,我希望unsigned int的最大值为+4294967295。为什么不是这样?

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

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

使用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,转换为该类型。 将换行符放在行的末尾。除其他原因外,这会使用默认设置line buffered刷新标准输出缓冲区。 使用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,转换为该类型。 将换行符放在行的末尾。除其他原因外,这会使用默认设置line buffered刷新标准输出缓冲区。
认真地说,在推断语言是否疯狂之前,请检查您的调试技术是否正确。%d表示int,您正在查找%u。也就是说,最大未签名值总是unsigned-1。您的代码调用未定义的行为。一切皆有可能。检查你的硬盘,它可能已被擦除。在询问之前启用并修复编译器警告@请记住,这个问题写得很好,有可编译的代码,OP已经记录了预期和实际的输出。请不要因为明显性的主观原因而否决投票。@cdarke:sizeoftype没有说明任何关于字体宽度的内容。sizeofint==1完全有效。即使使用CHAR_BIT==8,sizeofuint64_t也是8,而不是16。实际上,该值是不可能的。认真地说,在推断语言是否疯狂之前,请检查您的调试技术是否正确。%d代表int,您正在寻找%u。也就是说,最大未签名值总是unsigned-1。您的代码调用未定义的行为。一切皆有可能。检查你的硬盘,它可能已被擦除。在询问之前启用并修复编译器警告@请记住,这个问题写得很好,有可编译的代码,OP已经记录了预期和实际的输出。请不要因为明显性的主观原因而否决投票。@cdarke:sizeoftype没有说明任何关于字体宽度的内容。sizeofint==1完全有效。即使CHAR_BIT==8,sizeofuint64_t也是8,而不是16,实际上这个值是不可能的。unsigned-1和unsigned short-1用法是否对应于强制转换?对应吗?在要强制转换的操作数前面写入Paranthese中的类型是C中的强制转换运算符…我的坏。。。无法识别-1正在强制转换。未签名的-1和未签名的short-1用法对应于强制转换?对应?在要强制转换的操作数前面写入Paranthese中的类型是C中的强制转换运算符…我的坏。。。无法识别正在铸造的-1