所以,我知道stdint.h标题中的类型提供了标准化的宽度整数类型,但是我想知道用什么类型或方法来保证double跨平台的一个或其他浮点类型的大小?具体来说,这将处理包装数据void*
#include <stdio.h>
#include <stdlib.h>
void write_double(void* buf, double num)
{
*(double*)buf = num;
}
double read_double(void* buf)
{
return *(double*)buf;
}
int main(void) {
void* buffer = malloc(sizeof(double));
write_double(buffer, 55);
printf("The double is %f\n", read_double(buffer));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的程序中说,如果我将其void*写入文件或者如果它在另一个系统上使用,是否会有一些标准方法来保证浮点类型的大小或双倍?
如何保证C中双精确的大小?
使用 _Static_assert()
#include <limits.h>
int main(void) {
_Static_assert(sizeof (double)*CHAR_BIT == 64, "Unexpected double size");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
_Static_assert自C11起可用.否则代码可能会使用运行时断言.
#include <assert.h>
#include <limits.h>
int main(void) {
assert(sizeof (double)*CHAR_BIT == 64);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然这样可以确保a的大小double为64,但它并不能保证IEEE 754双精度二进制浮点格式的依从性.
代码可以使用 __STDC_IEC_559__
定义的实现
__STDC_IEC_559__应符合本附录中的规范C11附录F IEC 60559浮点运算
然而,这可能过于严格.许多实现都遵循该标准的大部分内容,但仍然没有设置宏.
是否有一些标准的方法来保证浮点类型的大小或双倍?
最好的保证是将FP值写为十六进制表示或具有足够十进制数的指数.请参见Printf宽度说明符以保持浮点值的精度