c - 程序打印不正确的符号常量值

标签 c printf unsigned-integer conversion-specifier

我目前正在学习 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 charunsigned Short 类型,您还可以使用转换说明符 %d,前提是类型 int 可以包含类型的整数提升后无符号类型的所有值。

关于c - 程序打印不正确的符号常量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72789522/

相关文章:

c - c程序中二维数组的初始化是否浪费太多时间?

C 编程,关于指针的困惑

c - STM32 中 PWM 的预分频器和周期值

c++ - 2 uint32_t 之间的数学运算返回 uint64_t

C程序,反转数组

c - 如何定义从文本文件扫描的行的结构最大大小

java重复字符

c++ - 如何将可变数量的参数传递给 printf/sprintf

c - 如何计算 32 位无符号整数中的前导零

c++ - 16 到 32 位整数转换与性能