若C/C++的double/float遵循IEEE 754-1985,其整数表示等是否未被使用?
关于C/C++整数表示与IEEE 754特殊值的疑问解答
一、C/C++是否不使用整数表示?
当然不是。C/C++拥有独立的整数类型体系,比如int、long、short、char以及它们的无符号版本unsigned int等,这些类型采用二进制整数形式存储,和IEEE 754浮点标准完全无关。
你提到的double只是C/C++的浮点类型之一,对应IEEE 754双精度浮点数,用于处理小数或超大范围数值;而整数类型专门用来存储精确整数值,运算效率更高,也不会出现浮点精度丢失问题。
示例代码:
// 整数类型存储,精确无误差 int count = 1000; // double是浮点类型,虽能存整数,但本质是浮点存储逻辑 double float_count = 1000.0;
二、NaN、Infinite、-Infinite、-0这些特殊值C里能用吗?
这些IEEE 754定义的特殊值,C99及之后标准、C++均支持,只是日常普通开发中使用场景较少:
- NaN:表示“非数值”,可通过
<math.h>中的NAN宏获取,比如计算负数开平方、0除以0这类非法运算时会生成NaN。 - Infinite(无穷大):正无穷用
INFINITY宏表示,正数除以0、数值超出double范围时会触发;负无穷同理。 - -0:C/C++浮点类型支持负零,普通输出可能显示为0,但可通过
signbit()函数(<math.h>中)检测符号位来区分。
示例代码:
#include <stdio.h> #include <math.h> int main() { double pos_inf = INFINITY; printf("正无穷:%f\n", pos_inf); double nan_val = NAN; printf("NaN:%f\n", nan_val); double neg_zero = -0.0; printf("负零输出:%f\n", neg_zero); if (signbit(neg_zero)) { printf("这是负零\n"); } return 0; }
注意:C89标准未定义这些宏,老版本编译器可能不支持,但当前主流编译器(GCC、Clang、MSVC)均支持C99及以上标准,可正常使用这些特殊值。
内容的提问来源于stack exchange,提问作者nonopolarity
相关产品推荐
相关产品推荐

