在Windows中将__int64转换为long

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

将正常types转换工作?

另外,如何将长转换为__int64? 如果多头是一个负值,它会起作用吗?

注 – 我正在谈论一个__int64variables总是包含一个长度不超过32位的值的场景。

1.长转换为__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的标准64位整数类型和unsigned version uint64_t 。如果要提供可移植代码,则应该使用它们而不是__int64

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

是的,类型转换将会很好,只要你能保证你的__int64值总是在一个很长的范围内。 不管涉及的值如何,从长到长的__int64都不会成为问题。

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

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