尽管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以大端格式存储数字,尽管它正在运行的机器上.为双重做这个最优雅的方法是什么?
可移植性和考虑格式的最佳方法是分别序列化/反序列化尾数和指数.为此,您可以使用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)
优雅的做法是将字节序问题限制在尽可能小的范围内.这个狭窄的范围是您的程序与外部世界之间的I/O边界.例如,将二进制数据发送到/从其他应用程序接收二进制数据的函数需要知道endian问题,将二进制数据写入/从某些数据文件读取二进制数据的函数也是如此.使这些接口认识到表示问题.
让其他一切幸福地无知问题.在其他地方使用本地表示.表示双精度浮点数double
而不是8字节的数组,表示32位整数表示int
或int32_t
不是4字节的数组,等等.在整个代码中处理字节序问题会使代码膨胀,容易出错并且难看.