在 Windows 中将 __int64 转换为 long

发布于 2024-08-20 14:46:15 字数 186 浏览 13 评论 0原文

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

正常的打字能起作用吗?

另外,将 long 转换为 __int64 怎么样?如果long是一个负值,它会起作用吗?

注意 - 我正在讨论这样一种场景,其中 __int64 变量将始终包含一个长度不超过 32 位的值。

How to convert __int64 to long in Windows (MSVC8 & MSVC6)?

Will a normal typecasting work?

Also, how about converting long to __int64? If the long is a negative value, will it work?

Note - I am talking of a scenario in which the __int64 variable will always contain a value which will not be more than 32 bits long.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不爱素颜 2024-08-27 14:46:15

1.将 long 转换为 __int64

根据 MSDN__int64 关键字上:

__int64 关键字声明一个新的
类型,64 位(8 字节)整数。作为
对于 int、short 和 long 类型,
__int64类型有对应的
无签名版本,所以 __int64
关键字实际上可以用来创建
两种类型。

以下代码示例展示了如何
声明两个 64 位整数,其中一个
已签名和其他未签名:

__int64signed_big_int;无符号 __int64 unsigned_big_int;

__int64 是有符号的,它应该比 long 更宽。因此,您可以将 long 分配给 __int64,甚至不需要类型转换,当然还有signed __int64支持负long。

2.将__int64转换为long 将

__int64转换为long是可以的,只是有可能丢失数据。我的msvc8只警告我可能会丢失数据。

3.注意:

C99 在 stdint.h 中定义了一个名为 int64_t 的标准 64 位整数类型和无符号版本 uint64_t。如果你想要要提供可移植代码,您应该使用它们,但不应该使用 __int64

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

1. Convert long to __int64

Acorrding to MSDN on the __int64 keyword:

The _ _int64 keyword declares a new
type, a 64-bit (8-byte) integer. As
with the int, short, and long types,
the _ _int64 type has a corresponding
unsigned version, so the _ _int64
keyword actually can be used to create
two types.

The following code sample shows how to
declare two 64-bit integers, one
signed and the other unsigned:

__int64 signed_big_int; unsigned __int64 unsigned_big_int;

__int64 is signed,and it should be wider than long.So you could assign long to __int64 without even a type cast and of course the signed __int64 support negative long.

2. Convert __int64 to long

It is OK to convert __int64 to long,only with possibility of loosing data.My msvc8 only warn me of the pssibility of loss of data.

3. Note:

C99 defined a standard 64-bit integer type named int64_t and unsigned version uint64_t in stdint.h.If you want to provide portable code, you should use them but not __int64.

Notice there is no standard 64-bit integer type in C++ programming language,MSVC use __int64,but in linux world you normally use int64_t or uint64_t which is type defined as long long or unsigned long long in C99's stdint.h.Here I assume your C++ compiler support the stdint.h header file.

不必在意 2024-08-27 14:46:15

是的,类型转换没问题,只要你能保证你的 __int64 值始终在 long 的范围内。向另一个方向进行转换,即从 long 到 __int64,无论涉及什么值,都不会出现问题。

Yes, typecasting will be fine, so long as you can guarantee your __int64 values are always within the range of a long. Casting in the other direction, i.e. from long to __int64 will not be a problem regardless of the values involved.

时间海 2024-08-27 14:46:15

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

Here is a small test. The explicit casts are necessary to avoid the warnings if compiled with /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 );
}

The output is:

i=-1
i=2147483647
i=-2147483648
i64=-2147483648
白色秋天 2024-08-27 14:46:15

32 位值可以毫无问题地分配给 64 位变量,无论有符号还是无符号。可以将 64 位值分配给 32 位变量,但如果需要超过 32 位来存储该值,则可能会丢失数据,因为它将被截断以适合较小的变量。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文