我正在尝试练习K& R C的2-1,但是当我运行该程序时,结果就是:
UNSIGNED TYPES
UNSIGNED CHAR: 0 255
UNSIGNED SHORT: 0 65535
UNSIGNED INT: 0 -1
UNSIGNED LONG; 0 -1
UNSIGNED INT
和UNSIGNED 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.h
和float.h
。
如何解决这个问题?
完整计划的链接是here。
更新1:我尝试替换%d
的最大范围的unsigned long
,这似乎有效,但unsigned int
为4294967925
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
答案 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
长度修饰符long
,ll
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是一个非常糟糕的选择