在Windows中将__int64转换为long

时间:2010-02-08 12:25:00

标签: c windows casting int64

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

正常的类型转换会有效吗?

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

注意 - 我说的是__int64变量总是包含一个不超过32位长的值的场景。

4 个答案:

答案 0 :(得分:5)

<强> 1。将long转换为__int64

__int64关键字的MSDN

  

_ _int64关键字声明一个新的   type,64位(8字节)整数。如   使用int,short和long类型,   _ _int64类型有一个对应的   无符号版本,所以_ _int64   关键字实际上可以用来创建   两种类型。

     

以下代码示例演示如何操作   声明两个64位整数,一个   签名,另一个未签名:

     

__ int64 signed_big_int; unsigned __int64 unsigned_big_int;

__int64已签名,且应该比long更宽。因此,您可以将long分配给__int64,甚至不会进行类型转换,当然{{1}支持负长。

<强> 2。将__int64转换为长

signed __int64转换为__int64是可以的,只有丢失数据的可能性。我的msvc8只警告我丢失数据的可能性。

第3。注意

C99在long中定义了一个名为int64_t的标准64位整数类型和无符号版本uint64_t。如果要提供可移植代码,则应使用它们而不是{{1 }}

请注意,C ++编程语言中没有标准的64位整数类型,MSVC使用stdint.h,但在Linux世界中,您通常使用__int64__int64,其类型定义为{ C99 int64_t中的{1}}或uint64_t。我假设您的C ++编译器支持long long头文件。

答案 1 :(得分:3)

是的,类型转换会很好,只要你可以保证你的__int64值总是在很长的范围内。无论所涉及的值如何,在另一个方向上进行投射,即从long到__int64都不会成为问题。

答案 2 :(得分:2)

这是一个小测试。如果使用/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

答案 3 :(得分:0)

32位值可以分配给64位变量,没有任何问题,有符号或无符号。可以为32位变量分配64位值,但如果需要超过32位来存储该值,则可能会丢失数据,因为它将被截断以适合较小的变量。