簡體   English   中英

如何定義80位大小的變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM