2010-02-08 76 views
3

如何在Windows中將__int64轉換爲long(MSVC8 & MSVC6)?在Windows中將__int64轉換爲long

將正常類型轉換工作?

另外,如何將長轉換爲__int64?如果多頭是一個負值,它會起作用嗎?

注 - 我正在談論__int64變量總是包含一個不超過32位長的值的情況。

回答

5

1。轉換長到__int64

Acorrding到MSDN__int64關鍵字:

的_ _int64關鍵字聲明新的 型,64位(8字節)整數。由於 與int,short和long類型 _ _int64類型具有相應的 未簽名版本,因此_ _int64 關鍵字實際上可用於創建 兩種類型。

以下代碼示例示出了如何 聲明兩個64位整數,一個 簽署和其他無符號:

__int64 signed_big_int; unsigned __int64 unsigned_big_int;

__int64簽訂後,它應該比long更寬。所以你可以分配給long__int64甚至一個類型轉換,當然還有signed __int64支持負長。

2.轉換__int64長

它是確定__int64轉換爲long,只有失去data.My msvc8只是提醒我數據丟失的pssibility的可能性。

3.注意

C99定義在stdint.h命名int64_t和未簽名版uint64_t。如果你想提供可移植的代碼標準的64位整數類型,你應該使用他們,但不__int64

公告中有C++編程語言沒有標準的64位整數類型,MSVC使用__int64,但在Linux世界中通常使用int64_tuint64_t它的類型定義爲C99的stdint.h。在這裏long longunsigned long long我假設你的C++編譯器支持stdint.h頭文件。

3

是的,類型轉換將會很好,只要你能保證你的__int64值總是在一個long範圍內。無論所涉及的值如何,從另一個方向(即從long到__int64)投射都不會成爲問題。

2

這是一個小測試。

#include <limits.h> 


int main(int argc, char *argv[]) 
{ 
    __int64 i64; 
    long i; 

    i64 = -1; 
    i = (long)i64; 
    printf("i=%d\n", i); 

    i64 = INT_MAX; 
    i = (long)i64; 
    printf("i=%d\n", i); 

    i64 = INT_MIN; 
    i = (long)i64; 
    printf("i=%d\n", i); 

    i64 = i; 
    printf("i64=%I64d\n", i64); 
} 

的輸出是::

i=-1 
i=2147483647 
i=-2147483648 
i64=-2147483648 
0

32位值可以被分配給64比特變量沒有任何問題,簽署或如果編譯/W3的顯式轉換是必要的,以避免警告無符號。將64位值分配給32位變量可以完成,但如果需要超過32位來存儲該值,則可能會丟失數據,因爲它將被截斷以適合較小的變量。