【问题标题】:Converting __int64 to long in Windows在 Windows 中将 __int64 转换为 long
【发布时间】:2010-02-08 12:25:00
【问题描述】:

如何在 Windows (MSVC8 & MSVC6) 中将 __int64 转换为 long?

正常的类型转换会起作用吗?

另外,将 long 转换为 __int64 怎么样?如果 long 是负值,它会起作用吗?

注意 - 我说的是 __int64 变量将始终包含一个长度不超过 32 位的值。

【问题讨论】:

    标签: c windows casting int64


    【解决方案1】:

    1.将 long 转换为 __int64

    根据__int64关键字上的MSDN

    _ _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 转换为 long

    可以将__int64 转换为long,只是可能会丢失数据。我的msvc8 只警告我可能会丢失数据。

    3.注意

    C99 在stdint.h 中定义了一个名为int64_t 和无符号版本uint64_t 的标准64 位整数类型。如果你想提供可移植的代码,你应该使用它们而不是__int64

    请注意,C++ 编程语言中没有标准的 64 位整数类型,MSVC 使用 __int64,但在 linux 世界中您通常使用 int64_tuint64_t,其类型定义为 long longunsigned long long在 C99 的 stdint.h 中。这里我假设你的 C++ 编译器支持 stdint.h 头文件。

    【讨论】:

      【解决方案2】:

      是的,类型转换没问题,只要你能保证你的 __int64 值总是在 long 的范围内。向另一个方向转换,即从 long 到 __int64 不会成为问题,无论所涉及的值如何。

      【讨论】:

        【解决方案3】:

        这是一个小测试。如果使用 /W3 编译,则需要显式转换以避免警告:

        #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
        

        【讨论】:

          【解决方案4】:

          32 位值可以毫无问题地分配给 64 位变量,无论有符号还是无符号。可以将 64 位值分配给 32 位变量,但如果存储该值需要超过 32 位,则可能会丢失数据,因为它将被截断以适应较小的变量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-12-20
            • 2013-07-26
            • 1970-01-01
            • 1970-01-01
            • 2013-08-21
            • 1970-01-01
            • 2015-04-27
            相关资源
            最近更新 更多