You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言打印UINT_MAX/ULONG_MAX异常显示为-1是什么原因

问题背景

正在学习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);
}

实现思路是引入<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本身的问题。

问题原因

该问题是代码编写错误导致,和编译器、Visual Studio无关,核心原因是printf的格式说明符和传入参数类型不匹配:

  • %d是专门用于输出有符号int类型值的格式说明符,会按照补码规则把传入的二进制值解析为有符号整数。
  • 常见环境下UINT_MAX的值为2^32-1(即二进制32位全为1),ULONG_MAX在32位环境、64位Windows环境下也为32位全1值,用%d解析该二进制序列时,补码规则下全1的32位有符号整数对应值就是-1,因此会打印出-1的结果。
  • unsigned char、unsigned short类型的值传入printf这类可变参数函数时,会发生默认参数提升,自动转换为int类型,两个类型的最大值255、65535都在有符号int的正数表示范围内,因此用%d打印不会出现异常。
修复方案

根据传入值的类型,使用匹配的格式说明符即可:

  • 无符号int类型对应格式说明符为%u
  • 无符号long类型对应格式说明符为%lu

修正后的核心打印代码如下:

printf("Unsigned Variable Ranges\n");
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:  %lu    %lu\n", 0, ULONG_MAX);

重新编译运行即可得到正确的取值范围结果。


内容的提问来源于stack exchange,提问作者Geekmeist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:36:24