2012-10-02 19 views
3

那麼我所看到的數據類型是什麼。我知道AS3的數字是64位,但它是雙精度。我在AS3轉換爲C++和因爲代碼是有效做到這一點:什麼是對應於AS3的C++數據類型編號(積分)

var i:Number = 123; 
i >> 3; // Yeah shift right a double precision datatype 

所以在C++我現在需要一個數據類型,它是在AS3數字類型的積分範圍(這是雙精度) 。請注意我正在轉換和編碼/解碼先前與AS3代碼一起使用的函數,所以我必須得到相同的結果。

在此先感謝。

+0

您說雙精度,但是您在標題中說「積分」。這是什麼?整體類型沒有精度,它們只有一個大小,不管它是否被簽名。 – KRyan

+0

對不起,我覺得我很困惑..會嘗試重新定義一點。 – user1715070

+0

問題是,在AS3中,您可以對Number數據類型(這是雙精度類型)進行按位操作。但是你不能在C++中做同樣的事情。所以我需要在C++中找到一個可以執行按位操作的數據類型(因此就我所知它必須是Integral),並且仍然具有與Number相同的範圍(忽略昏迷後的東西)。那麼數字可以容納的最大積分值是多少? – user1715070

回答

1

AS3移位運算符將被移位的表達式和移位量轉換爲32位整數。在C++中,您通過將double數據類型轉換爲int並進行移位來模擬此行爲:

#include <iostream> 

int main(int argc, char **argv) { 
    double i(91.5); 
    int v(static_cast<int>(i) >> 3); 
    std::cout << "v = " << v << std::endl; // outputs "v = 11" 
    return 0; 
} 
+0

我目前嘗試實現的宏是#define D2I(X)((__int64)(X))。基本上我需要將它改爲#define D2I(X)((__int32)(X)) – user1715070

+0

是的,你的宏應該足夠了。我會優先選擇C++風格的類型轉換和內聯函數而不是宏:inline __int32 d2i(con​​st double&v){return static_cast <__int32>(v); } –

0

基本上,在AS3中Number是一個雙精度數,所以在C++中它將是double類型。但是,AS3中的位移是通過隱式轉換完成的。您應該檢查如果結果實際上是一個int,或雙,如果INT,你做

i=floor(i/8.0); 

,如果雙,你把地板()調用。

總之,您必須顯式重寫在整數而不是雙精度上完成的操作。但是,當一個操作需要int時,你可以像(int)i那樣做,而且我是double。

相關問題