Converting __int64 to long in Windows

做~自己de王妃 提交于 2019-12-20 02:12:21

问题


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.


回答1:


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.




回答2:


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.




回答3:


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



回答4:


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.



来源:https://stackoverflow.com/questions/2221487/converting-int64-to-long-in-windows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!