[英]How to get the mantissa of an 80-bit long double as an int on x86-64
[英]How to define a 80-bit size variable
我需要在由gcc編譯的C程序中聲明一個80位大小的變量(我需要將其傳遞給可在fpu上運行的asm過程的數據,此過程由用C編寫的程序調用)
我的架構是AMD x64
我嘗試了long double
__float80
,但是對於他們來說sizeof
返回12而不是10
。 那么如何聲明這樣的變量呢?
該大小包括用於對齊的填充,但是它還是80位的值。 該手冊說:
-m96bit-long-double
-m128bit-long-double
這些開關控制long double類型的大小。 x86-32應用程序二進制接口將大小指定為96位,因此-m96bit-long-double是32位模式下的默認值。
現代體系結構(奔騰和更新的體系結構)更喜歡將long double對齊到8字節或16字節的邊界。 在符合ABI的陣列或結構中,這是不可能的。 因此,指定-m128bit-long-double可以通過將long double填充額外的32位零來將long double與16字節邊界對齊。
在x86-64編譯器中,-m128bit-long-double是默認選擇,因為其ABI指定long double在16字節邊界上對齊。
請注意,對於長雙精度,這兩個選項均未對80位的x87標准啟用任何額外的精度。
警告:如果您覆蓋目標ABI的默認值,則這將更改包含長雙精度變量的結構和數組的大小,並修改采用長雙精度的函數的函數調用約定。 因此,它們與沒有該開關的編譯代碼不二進制兼容。
-mlong-double-64
-mlong-double-80
-mlong-double-128
這些開關控制long double類型的大小。 64位的大小使long double類型等效於double類型。 這是32位Bionic C庫的默認設置。 128位的大小使long double類型等效於__float128類型。 這是64位Bionic C庫的默認設置。
警告:如果您覆蓋目標ABI的默認值,則這將更改包含長雙精度變量的結構和數組的大小,並修改采用長雙精度的函數的函數調用約定。 因此,它們與沒有該開關的編譯代碼不二進制兼容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.