我正在尝试用4个复合字节构建一个32位浮点数.有没有比使用以下方法更好(或更便携)的方法? #include iostreamtypedef unsigned char uchar;float bytesToFloat(uchar b0, uchar b1, uchar b2, uchar b3){ float outpu
#include <iostream> typedef unsigned char uchar; float bytesToFloat(uchar b0, uchar b1, uchar b2, uchar b3) { float output; *((uchar*)(&output) + 3) = b0; *((uchar*)(&output) + 2) = b1; *((uchar*)(&output) + 1) = b2; *((uchar*)(&output) + 0) = b3; return output; } int main() { std::cout << bytesToFloat(0x3e, 0xaa, 0xaa, 0xab) << std::endl; // 1.0 / 3.0 std::cout << bytesToFloat(0x7f, 0x7f, 0xff, 0xff) << std::endl; // 3.4028234 × 10^38 (max single precision) return 0; }你可以使用memcpy( Result)
float f; uchar b[] = {b3, b2, b1, b0}; memcpy(&f, &b, sizeof(f)); return f;
或工会*(Result)
union { float f; uchar b[4]; } u; u.b[3] = b0; u.b[2] = b1; u.b[1] = b2; u.b[0] = b3; return u.f;
但这并不比你的代码更便携,因为不能保证平台是little-endian或浮点数是使用IEEE binary32甚至sizeof(float)== 4.
(注*:如@James所述,技术上不允许在标准(C§[class.union] / 1)中访问工会成员u.f.)