如何存储双端独立

Rok*_*alj 3 c++ endianness

尽管big-endian计算机的使用并不是很广泛,但我希望以独立的格式存储double数据类型.

对于int,这非常简单,因为位移使得非常方便.

int number;
int size=sizeof(number);
char bytes[size];

for (int i=0; i<size; ++i)
    bytes[size-1-i] = (number >> 8*i) & 0xFF;
Run Code Online (Sandbox Code Playgroud)

此代码snipet以大端格式存储数字,尽管它正在运行的机器上.为双重做这个最优雅的方法是什么?

imr*_*eal 7

可移植性和考虑格式的最佳方法是分别序列化/反序列化尾数和指数.为此,您可以使用frexp()/ ldexp()函数.

例如,要序列化:

int exp;
unsigned long long mant;

mant = (unsigned long long)(ULLONG_MAX * frexp(number, &exp));

// then serialize exp and mant.
Run Code Online (Sandbox Code Playgroud)

然后反序列化:

// deserialize to exp and mant.

double result = ldexp ((double)mant / ULLONG_MAX, exp);
Run Code Online (Sandbox Code Playgroud)

  • 确实是个好主意,可能会对未来的访客有所帮助。但就我而言,输出格式已经商定。它是双精度 IEE 754。+1 (2认同)

Dav*_*men 5

优雅的做法是将字节序问题限制在尽可能小的范围内.这个狭窄的范围是您的程序与外部世界之间的I/O边界.例如,将二进制数据发送到/从其他应用程序接收二进制数据的函数需要知道endian问题,将二进制数据写入/从某些数据文件读取二进制数据的函数也是如此.使这些接口认识到表示问题.

让其他一切幸福地无知问题.在其他地方使用本地表示.表示双精度浮点数double而不是8字节的数组,表示32位整数表示intint32_t不是4字节的数组,等等.在整个代码中处理字节序问题会使代码膨胀,容易出错并且难看.