C++数值类型极值输出异常求助:为何显示为非十进制值?
问题原因及解决方法
你的问题核心是输出整数类型时用错了格式符,导致有符号整数被当作无符号八进制数输出了——你看到的37777777600和177是八进制表示,对应十进制的-128和127。
常见错误场景
比如你可能写了类似这样的代码:
#include <stdio.h> #include <climits> int main() { printf("char range: %o to %o\n", CHAR_MIN, CHAR_MAX); return 0; }
这里的%o是八进制无符号输出格式符,会把有符号的CHAR_MIN(-128)按照无符号数的八进制形式打印出来,就出现了你看到的异常值。
修正方案
- 用正确的格式符匹配类型:
- 有符号整数类型(char、short、int、long)用十进制有符号格式符
%d或%i:printf("char range: %d to %d\n", CHAR_MIN, CHAR_MAX); printf("short range: %d to %d\n", SHRT_MIN, SHRT_MAX); printf("int range: %d to %d\n", INT_MIN, INT_MAX); printf("long range: %ld to %ld\n", LONG_MIN, LONG_MAX); - 无符号类型用十进制无符号格式符
%u:printf("unsigned char range: %u to %u\n", 0, UCHAR_MAX); printf("unsigned int range: %u to %u\n", 0, UINT_MAX);
- 有符号整数类型(char、short、int、long)用十进制有符号格式符
- 更推荐的C++方式:
直接用cout输出,它会自动处理类型的符号和格式,不需要手动指定格式符,更不容易出错:#include <iostream> #include <climits> #include <cfloat> int main() { std::cout << "char range: " << CHAR_MIN << " to " << CHAR_MAX << "\n"; std::cout << "short range: " << SHRT_MIN << " to " << SHRT_MAX << "\n"; std::cout << "int range: " << INT_MIN << " to " << INT_MAX << "\n"; std::cout << "long range: " << LONG_MIN << " to " << LONG_MAX << "\n"; std::cout << "float range: " << FLT_MIN << " to " << FLT_MAX << "\n"; std::cout << "double range: " << DBL_MIN << " to " << DBL_MAX << "\n"; std::cout << "long double range: " << LDBL_MIN << " to " << LDBL_MAX << "\n"; std::cout << "unsigned char range: 0 to " << UCHAR_MAX << "\n"; std::cout << "unsigned int range: 0 to " << UINT_MAX << "\n"; return 0; }
内容的提问来源于stack exchange,提问作者Felipe Maion
相关产品推荐
相关产品推荐

