调用<limits.h>常量返回异常值及int范围与书籍long范围一致问题咨询
问题原因与解答
1. 常量输出异常的成因
你遇到的输出异常完全是printf使用错误导致,具体有两个问题:
- 格式符与参数类型不匹配:
printf要求格式符必须和传入参数的类型严格对应:UINT_MAX是unsigned int类型,使用有符号整型格式符%d会触发解析错误,无符号最大值的二进制为全1,用有符号int解析自然得到-1LONG_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
相关产品推荐
相关产品推荐

