我目前正在学习 C,并尝试完成 K&R 练习 2-1。 (编写一个程序来确定 char、short、int 和 long 变量的范围,两者都 有符号和无符号,通过从标准 header 打印适当的值并通过直接计算。)我编写了以下代码来实现此目的:
#include <stdio.h>
#include <limits.h>
#include <float.h>
int main() {
printf("Unsigned Variable Ranges\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);
}
我的思考过程是使用在limits.h和float.h中找到的符号常量来打印程序中的最小值和最大值。 char 和short 值打印正确,但int 和long 值打印为-1。终端显示:
Unsigned Variable Ranges
Unsigned char: 0 255
Unsigned short: 0 65535
Unsigned int: 0 -1
Unsigned long: 0 -1
这是我的错误还是编译器/Visual Studio 错误?
最佳答案
对于无符号整数,您必须使用转换说明符 u
而不是 d
。另外,对于长整数类型,您必须使用长度修饰符l
。
因此 printf 的调用可以如下所示
printf("Unsigned char: %u %u\n", 0, UCHAR_MAX);
printf("Unsigned short: %u %u\n", 0, USHRT_MAX);
printf("Unsigned int: %u %u\n", 0, UINT_MAX);
printf("Unsigned long: %d %lu\n", 0, ULONG_MAX);
对于 unsigned char
和 unsigned Short
类型,您还可以使用转换说明符 %d
,前提是类型 int
可以包含类型的整数提升后无符号类型的所有值。
关于c - 程序打印不正确的符号常量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72789522/