c – 从4个复合字节中构建一个32位浮点数
发布时间:2020-12-16 09:14:01 所属栏目:百科 来源:网络整理
导读:我正在尝试用4个复合字节构建一个32位浮点数.有没有比使用以下方法更好(或更便携)的方法? #include iostreamtypedef unsigned char uchar;float bytesToFloat(uchar b0,uchar b1,uchar b2,uchar b3){ float output; *((uchar*)(output) + 3) = b0; *((uchar
我正在尝试用4个复合字节构建一个32位浮点数.有没有比使用以下方法更好(或更便携)的方法?
#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,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.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |