如何在Windows中将__int64转换为long(MSVC8& MSVC6)?
正常的类型转换会有效吗?
另外,如何将long转换为__int64?如果long是负值,它会起作用吗?
注意 - 我说的是__int64变量总是包含一个不超过32位长的值的场景。
答案 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位来存储该值,则可能会丢失数据,因为它将被截断以适合较小的变量。