【发布时间】:2018-04-02 02:06:32
【问题描述】:
关于尝试生成浮点数的位模式如下:
std::cout << std::bitset<32>(32.5) << std::endl;
编译器生成此警告:
warning: implicit conversion from 'double' to 'unsigned long long' changes value
from 32.5 to 32 [-Wliteral-conversion]
std::cout << std::bitset<32>(32.5) << std::endl;
忽略警告时的输出 :) :
00000000000000000000000000100000
为什么当转换为 char* 时,bitset 不能检测浮点数并正确输出位序列,而步行内存确实显示正确的序列? 这可行,但机器依赖于字节顺序并且大多不可读:
template <typename T>
void printMemory(const T& data) {
const char* begin = reinterpret_cast<const char*>(&data);
const char* end = begin + sizeof(data);
while(begin != end)
std::cout << std::bitset<CHAR_BIT>(*begin++) << " ";
std::cout << std::endl;
}
输出:
00000000 00000000 00000010 01000010
有理由不支持浮点数吗?花车有替代品吗?
【问题讨论】:
-
可能出于同样的原因它不支持有符号整数 :)
-
C++ 不要求浮点数使用任何特定的位表示。
-
@Dúthomhas,这是否类似于字节排序?在某些时候,C++ 可能知道浮点数是如何表示的,或者它是一种盲通?
-
呃,不是这样。 C 和 C++ 将浮点表示推迟到底层硬件(就像它们对符号表示所做的一样)。当然,这在技术上不是 std::bitset 不能接受此类类型作为参数的任何原因,但它将需要技术上的 UB 强制转换来获取任何不是普通无符号类型的位值整数。
-
哦,呃,在处理无符号整数时字节顺序不是问题,因为可以通过一些简单的移位获得位。对于可以用于其他类型的任何其他表示,不能这样说。有些机器对整数和浮点类型使用不同的字节顺序,IIRC。
标签: c++ std-bitset