【发布时间】:2015-06-05 11:56:16
【问题描述】:
当我在 C++ 中将 32 位浮点数转换为 64 位无符号整数时,一切正常。 溢出会导致 FE_OVERFLOW 标志被设置 (cfenv) 并返回值 0。
std::feclearexcept(FE_ALL_EXCEPT);
float a = ...;
uint64_t b = a;
std::fexcept_t flags;
std::fegetexceptflag(&flags, FE_ALL_EXCEPT);
但是当我像这样将 32 位浮点数转换为 32 位无符号整数时:
std::feclearexcept(FE_ALL_EXCEPT);
float a = ...;
uint32_t b = a;
std::fexcept_t flags;
std::fegetexceptflag(&flags, FE_ALL_EXCEPT);
除了高位 32 位被截断外,我的行为方式与 64 位转换完全相同。 等于:
std::feclearexcept(FE_ALL_EXCEPT);
float a = ...;
uint64_t b2 = a;
uint32_t b = b2 & numeric_limits<uint32_t>::max();
std::fexcept_t flags;
std::fegetexceptflag(&flags, FE_ALL_EXCEPT);
所以只有当指数大于或等于 64 并且 在指数 32 和 64 之间,它返回 64 位转换的低 32 位而不设置溢出。 这很奇怪,因为您会认为它会在指数 32 处溢出。
这是应该的方式,还是我做错了什么?
编译器是:LLVM 版本 6.0 (clang-600.0.45.3)(基于 LLVM 3.5svn)
【问题讨论】:
-
无符号数是否溢出?还是叫溢出?
-
当浮点数表示的数字不适合目标整数时,它是一个FE_OVERFLOW。
标签: c++ floating-point type-conversion