如何在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_t
或uint64_t
,它在C99的stdint.h
定义为long long
或unsigned 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位来存储该值,则可能丢失数据,因为它将被截断以适应较小的变量。