如何在 Windows(MSVC8 和 MSVC6)中将 __int64 转换为 long?
正常的类型转换会起作用吗?
另外,如何将 long 转换为 __int64?如果 long 是负值,它会起作用吗?
注意 - 我说的是 __int64 变量将始终包含一个不超过 32 位长的值的场景。
1.将long转换为__int64
根据MSDN上的__int64
关键字:
_ _int64 关键字声明了一个新类型,一个 64 位(8 字节)整数。与 int、short 和 long 类型一样,_ _int64 类型也有对应的无符号版本,所以 _ _int64 关键字实际上可以用来创建两种类型。
以下代码示例展示了如何声明两个 64 位整数,一个有符号,另一个无符号:
__int64 有符号的_big_int;无符号 __int64 无符号大整数;
__int64
已签名,它应该比long
. 所以你甚至可以在没有类型转换的情况下分配long
给__int64
,当然signed __int64
支持负长。
2.将__int64转换为long
可以转换__int64
为long
,只有可能丢失数据。我的 msvc8 只警告我数据丢失的可能性。
3.注意:
C99 定义了一个标准的 64 位整数类型命名int64_t
和无符号版本uint64_t
。stdint.h
如果你想提供可移植的代码,你应该使用它们而不是__int64
.
请注意,在 C++ 编程语言中没有标准的 64 位整数类型,MSVC 使用__int64
,但在 linux 世界中,您通常使用int64_t
或在 C99 中uint64_t
定义的类型long long
。这里我假设您的 C++ 编译器支持头文件。unsigned long long
stdint.h
stdint.h
是的,类型转换会很好,只要你能保证你的 __int64 值总是在 long 的范围内。无论涉及的值如何,向另一个方向转换,即从 long 到 __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-bit values can be assigned to 64-bit variables without any problems, signed or unsigned. Assigning a 64-bit value to a 32-bit variable can be done, but loss of data is possible if more than 32 bits are required to store the value, as it will be truncated to fit into the smaller variable.