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

调用<limits.h>常量返回异常值及int范围与书籍long范围一致问题咨询

问题原因与解答

1. 常量输出异常的成因

你遇到的输出异常完全是printf使用错误导致,具体有两个问题:

  • 格式符与参数类型不匹配:printf要求格式符必须和传入参数的类型严格对应:
    • UINT_MAX是unsigned int类型,使用有符号整型格式符%d会触发解析错误,无符号最大值的二进制为全1,用有符号int解析自然得到-1
    • LONG_MAX、LONG_MIN是long类型,不能用对应int类型的%d输出,需使用%ld格式符
  • 参数数量与占位符数量不匹配:输出UINT_MAX的代码行中,格式串声明了2个%d占位符,但仅传入了1个UINT_MAX参数,属于C标准定义的未定义行为,输出的第二个0是程序从栈空间读取的脏数据,没有实际意义。

修正后的测试代码如下:

#include <stdio.h>
#include <limits.h>
int main(){
    printf(" [INT]\t|%d | %d|\n", INT_MAX, INT_MIN);
    printf("[UINT]\t|%11u| %11u|\n", UINT_MAX, 0U); // 使用%u输出无符号类型,参数数量与占位符一致
    printf("[SHRT]\t|%11d| %11d|\n", SHRT_MAX, SHRT_MIN);
    printf("[LONG]\t|%11ld| %11ld|\n", LONG_MAX, LONG_MIN); // 使用%ld输出long类型
    return 0;
}

2. int与long取值范围一致属于合理情况

C语言标准仅对各整型的最小取值范围做强制约束,没有要求不同整型的长度必须不同,仅规定必须满足sizeof(short) <= sizeof(int) <= sizeof(long):

  • short最小长度为16位
  • int最小长度为16位
  • long最小长度为32位

你遇到的情况是主流实现的正常表现:32位全平台、64位Windows系统采用的LLP64内存模型中,int和long均为32位,取值范围完全相同。《C程序设计语言》成书较早,当时主流实现多为16位int、32位long,因此和当前测试结果存在差异,完全符合C标准要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:06:04