【发布时间】:2014-07-14 18:12:16
【问题描述】:
我正在尝试做 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
【问题讨论】:
-
%ul应该是%lu,而您在结果的最后一行将l错误转录为1 -
我已经这样做了,它似乎比
%ul工作得更好,但是你愿意解释一下(如果你知道的话)为什么%ul在ULONG_MAX的末尾添加一个吗?为什么%lu没有? -
%ul是%u后跟字母l。
标签: c types range unsigned format-specifiers