我目前正在学习C语言,并试图完成K&R练习2-1.(编写一个程序来确定char、short、int和long变量的范围

#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);
}

我的思考过程是使用极限中的符号常量.h和浮动.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.对于long integer类型,还必须使用长度修饰符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++相关问答推荐

在x86汇编中,为什么当分子来自RDRAND时DIV会引发异常?

如何将一个enum类型类型转换为另一个类型?

字符串令牌化xpath表达式

从内联程序集调用Rust函数和调用约定

如何在C中只使用一个带双方括号([i][j])访问语法的malloc来分配动态大小的2d数组?

如何解决C中的严格别名?

如何在Visual Studio代码中关闭此函数名称显示功能?

为什么GCC可以调用未定义的函数?

使用GOTO从多个嵌套循环C继续

在列表中插入Int指针(C)

为什么realloc函数在此代码中修改变量?

我可以创建适用于不同endian的 colored颜色 struct 吗?

如何在zOS上编译共享C库

C++中PUTS函数的返回值

隐藏测试用例无法在c程序中计算位数.

C语言中的指针和多维数组

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

将不同类型的指针传递给函数(C)

将指针的地址加载到寄存器内联拇指组件中

#define X Defined(Y) 是有效的 C/C++ 宏定义吗?