我需要在gcc编译的C程序中声明一个80位大小的变量(我需要它将数据传递给工作于fpu的asm程序,这个程序用C语言编写)
我的架构是AMD x64
我尝试了long double
,__float80
,但对于他们sizeof
则返回12而不是10
。
那么如何声明这样的变量?
答案 0 :(得分:4)
大小包括用于对齐的填充,但它仍然是80位值。 manual说:
-m96bit - 长 - 双
-m128bit - 长 - 双
这些开关控制long double类型的大小。 x86-32应用程序二进制接口指定大小为96位,所以 -m96bit-long-double是32位模式的默认值。
现代架构(Pentium和更新版本)更喜欢使用long double来对齐8或16字节边界。在符合ABI的阵列或结构中,这是不可能的。因此,指定-m128bit-long-double将long double与16字节边界对齐,方法是将long double填充为额外的32位零。
在x86-64编译器中,-m128bit-long-double是默认选择,因为它的ABI指定long double在16字节边界上对齐。
请注意,对于长双精度而言,这两个选项都不会为80位的x87标准提供任何额外的精度。
警告:如果覆盖目标ABI的默认值,则会更改包含long double变量的结构和数组的大小,以及修改long double函数的函数调用约定。因此,它们与没有该开关编译的代码不是二进制兼容的。
-mlong双-64
-mlong双-80
-mlong双-128
这些开关控制long double类型的大小。 64位的大小使得long double类型等同于double类型。这是32位Bionic C库的默认值。 128位的大小使得long double类型等同于__float128类型。这是64位Bionic C库的默认设置。
警告:如果覆盖目标ABI的默认值,则会更改包含long double变量的结构和数组的大小,以及修改long double函数的函数调用约定。因此,它们与没有该开关编译的代码不是二进制兼容的。