意外的无符号最大结果

时间:2014-05-26 03:11:39

标签: c types unsigned

我正在尝试练习K& R C的2-1,但是当我运行该程序时,结果就是:

        UNSIGNED TYPES
UNSIGNED CHAR:  0     255
UNSIGNED SHORT: 0     65535
UNSIGNED INT:   0     -1
UNSIGNED LONG;  0     -1

UNSIGNED INTUNSIGNED LONG的结果不应该是-1,它应该是参考中的值。 (附录B.11第213页)

/* UNSIGNED TYPES */
printf("\n\tUNSIGNED TYPES\n");
printf("UNSIGNED CHAR:  %d      %d\n", 0, UCHAR_MAX);
printf("UNSIGNED SHORT: %d      %d\n", 0, USHRT_MAX);
printf("UNSIGNED INT:   %d      %d\n", 0, UINT_MAX);
printf("UNSIGNED LONG:  %d      %d\n", 0, ULONG_MAX);

奇怪的是,我不认为我的代码有问题,最小范围是0,因为我读到unsigned类型是非负的。我已经加入了limits.hfloat.h

如何解决这个问题?

完整计划的链接是here

更新1:我尝试替换%d的最大范围的unsigned long,这似乎有效,但unsigned int4294967925 65535。感谢您帮助我解决unsigned long问题,我希望您能帮我解决unsigned int问题。

更新2 :我将ULONG_MAX的字符序列从%ul更改为%lu

以下是代码和结果:

代码:

/* UNSIGNED TYPES */
printf("\n\tUNSIGNED TYPES\n");
printf("UNSIGNED CHAR:  %d      %u\n", 0, UCHAR_MAX);
printf("UNSIGNED SHORT: %d      %u\n", 0, USHRT_MAX);
printf("UNSIGNED INT:   %d      %u\n", 0, UINT_MAX);
printf("UNSIGNED LONG:  %d      %lu\n", 0, ULONG_MAX);

结果:

        UNSIGNED TYPES
UNSIGNED CHAR:  0     255
UNSIGNED SHORT: 0     65535
UNSIGNED INT:   0     4294967925
UNSIGNED LONG;  0     4294967925

3 个答案:

答案 0 :(得分:3)

%d用于有符号整数,无符号整数和长期分别使用%u%lu

答案 1 :(得分:1)

您需要使用%u的格式规范来打印unsigned int。

通过使用%d,位模式被解释为带符号的int。

答案 2 :(得分:1)

您是否准确复制了该程序的输出?您在代码中编写UNSIGNED LONG:,但在输出中它变为UNSIGNED LONG;unsigned long无法比unsigned int

长一位数

此外,您使用的是错误的类型说明符,结果为undefined behavior。您必须%u使用unsigned int l长度修饰符longll long long。{/ p>

16位计算的时代早在几十年前就已存在,因此除了8位或16位嵌入式系统外,大多数现代系统的int大小为32位,因此范围为[0,2]如你所见, 32 -1]或[0,4294967295]。取决于您使用的系统,long将具有不同的大小。通常在Windows上它是32位类型,在Unix / Linux上它是64位。 C标准要求int至少为16位,long至少为32位。只保证long long至少为64位,因此您也需要检查它。

printf("UNSIGNED CHAR:       %u    %u\n",   0U, UCHAR_MAX);
printf("UNSIGNED SHORT:      %u    %u\n",   0U, USHORT_MAX);
printf("UNSIGNED INT:        %u    %u\n",   0U, UINT_MAX);
printf("UNSIGNED LONG:       %lu   %lu\n",  0UL, ULONG_MAX);
printf("UNSIGNED LONG LONG:  %llu  %llu\n", 0ULL, ULONGLONG_MAX);

如果你在Windows上,unsigned int和unsigned long的max应该是4294967295。

请注意,使用ALL CAPS是一个非常糟糕的选择