2012-02-13 123 views
1

我在我的64位計算機中使用double longsizeof(double long)16 bytes。 所以我做了如下分配:整型常量對於其類型而言太大並且對二元運算符無效操作數

long double f = 0xA0000000000000000000000000000000; // 32 characters in hex 

,我得到這樣的警告:warning: integer constant is too large for its type。該警告看起來不正確,我的常數可以很容易地保存在一個128位的值。那麼,爲什麼我會收到警告?

我也有這樣的代碼:

long double tmp = 0x90000000CCCCCCCC0000000000000000; 
    long double res = (f & tmp); // where f is the previously defined variable 

,我得到以下錯誤error: invalid operands to binary &。爲什麼?

+4

'long double'是一個浮點類型。 – Mysticial 2012-02-13 11:33:46

+3

你確定你不是指'long long'嗎? – 2012-02-13 11:34:21

+0

@ MichaelKrelin-hacker'long long'在我的64位機器中很不幸是一個64位的值,而不是我需要的128位。 @Mystical似乎你是正確的,這就是爲什麼'&'不起作用,但是在C中可能有另一種128位類型,我可以使用它嗎? – 2012-02-13 11:36:09

回答

2
error: invalid operands to binary & 

因爲ftmp是浮點數,不是整數,它們不能作爲參數傳遞給二進制&

long double f = 0xA0000000000000000000000000000000 

您正在初始化一個整數常數的浮點變量。這本身就是可以的,但是整數常量有它自己的類型,它只能與最大的整數類型一樣大(編譯器選擇適合的類型)。如果編譯器中最大的整數類型少於128位,這將不起作用。

順便說一句,sizeof(double long) == 16並不意味着long double有128位表示。

+0

嗯......是的,我錯過了。你可能知道任何其他類型的128位值,我可以使用二進制運算符嗎? (我的'長long'是64位) – 2012-02-13 11:39:17

1

擴大我的評論:

long double是一個浮點類型。這就是爲什麼你不能對它們進行按位操作的原因。

不幸的是,該標準並不能保證128位整數類型。我知道的唯一編譯器實際上支持它作爲擴展名是GCC via __int128。 (編輯:它看起來並不總是支持它)

MSVC也有__int128類型,但它仍然只保留和未實現。

如果您只是按位操作,則可以使用具有兩個64位整數的結構。或者,如果您使用的是x86,則可以使用128位SSE數據類型。

+0

關於'__int128'它寫入:'這裏是在GCC表達類型__int128的用於具有小於128位長width.'長整型對象的整數常數不支持。我的long long是64字節,所以不支持! – 2012-02-13 11:48:32

+0

是的,我注意到了。如果你想要的不僅僅是按位運算符,那麼除非你找到/寫出一個輕量級的128位整數庫,否則你運氣不好。 – Mysticial 2012-02-13 11:49:57

1

0xA0000000000000000000000000000000是一個整數常量,取決於您的系統,它可能不受支持。整型常量的較大類型爲unsigned long long,如果系統中unsigned long long的寬度爲64位,則此常數不適合。

你可以做的是使用一個十六進制浮點常量而不是一個十六進制整數常量。

long double f = 0xA0000000000000000000000000000000p0L; 
                ^^ the exponent is 0 

是確定的。

p引入指數(必需),L表示它是long double文字(默認值爲double)。

十六進制浮點常量是C99此外,請注意在十六進制的浮動需要指數部分的常數。

關於位運算符(你問題的第二部分),位運算符的操作數必須是整數類型的,所以你不能在浮點值執行按位運算。

相關問題