【发布时间】:2010-02-08 12:25:00
【问题描述】:
如何在 Windows (MSVC8 & MSVC6) 中将 __int64 转换为 long?
正常的类型转换会起作用吗?
另外,将 long 转换为 __int64 怎么样?如果 long 是负值,它会起作用吗?
注意 - 我说的是 __int64 变量将始终包含一个长度不超过 32 位的值。
【问题讨论】:
如何在 Windows (MSVC8 & MSVC6) 中将 __int64 转换为 long?
正常的类型转换会起作用吗?
另外,将 long 转换为 __int64 怎么样?如果 long 是负值,它会起作用吗?
注意 - 我说的是 __int64 变量将始终包含一个长度不超过 32 位的值。
【问题讨论】:
1.将 long 转换为 __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 和无符号版本uint64_t 的标准64 位整数类型。如果你想提供可移植的代码,你应该使用它们而不是__int64。
请注意,C++ 编程语言中没有标准的 64 位整数类型,MSVC 使用 __int64,但在 linux 世界中您通常使用 int64_t 或 uint64_t,其类型定义为 long long 或 unsigned long long在 C99 的 stdint.h 中。这里我假设你的 C++ 编译器支持 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 位值可以毫无问题地分配给 64 位变量,无论有符号还是无符号。可以将 64 位值分配给 32 位变量,但如果存储该值需要超过 32 位,则可能会丢失数据,因为它将被截断以适应较小的变量。
【讨论】: