2010-02-08 3 views
3

Windows에서 __int64를 long으로 변환하는 방법 (MSVC8 & MSVC6)?Windows에서 __int64를 long으로 변환

정상적인 유형 캐스팅이 작동합니까?

또한 long을 __int64로 변환하는 방법은 무엇입니까? long이 음의 값이면 작동할까요?

주 - __int64 변수에 항상 32 비트를 넘지 않는 값이 포함되는 시나리오에 대해 이야기하고 있습니다.

답변

5

1. 변환

__int64 키워드 MSDN에 Acorrding __int64 긴 :

_ _int64 키워드가 새 유형을 선언, 64 비트 (8 바이트) 정수 . int, short 및 long 형식을 사용하면 _ _int64 형식에 해당 서명되지 않은 버전이 있으므로 두 가지 유형을 만들 때 _키워드를 실제로 사용할 수 있습니다.

다음 코드 샘플 두 개의 64 비트 정수 번 서명과 다른 서명으로 선언하는 방법을 보여준다 :

__int64 signed_big_int 단계; 서명되지 않은 __int64 unsigned_big_int;

__int64

서명하고, 당신이 signed __int64 지원 부정적인 긴도 타입 캐스트없이 물론 __int64long를 할당 할 수 낭포는 long보다 넓게해야한다. 긴

단지 전용 데이터의 손실의 pssibility의 저를 경고 msvc8 data.My을 잃어버린의 가능성, long__int64 변환 확인되는

2. 변환 __int64.

3 주 :

C99은 당신이 그들을 사용하지만 __int64한다, 당신은 휴대용 코드를 제공 할 .If stdint.hint64_t 및 서명되지 않은 버전 uint64_t라는 이름의 표준 64 비트 정수 유형을 정의. C++ 프로그래밍 언어에서 표준 64 비트 정수이 존재하지 않는

공지 사항, MSVC는 __int64를 사용하지만 리눅스 세계에서 일반적 C99의 stdint.h라도 좋습니다에 long long 또는 unsigned long long으로 정의 유형 int64_t 또는 uint64_t 내가 당신의 C를 가정 사용 ++ 컴파일러는 stdint.h 헤더 파일을 지원합니다.

3

그렇습니다. __int64 값이 항상 long의 범위 내에 있음을 보장 할 수 있다면 타입 캐스팅이 좋을 것입니다. 다른 방향, 즉 long에서 int64로 캐스팅하는 것은 관련된 값에 관계없이 문제가되지 않습니다.

2

다음은 작은 테스트입니다.

#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 
0
값은 문제없이 64 비트 변수에 할당 될 수있는 32 비트 서명

또는 /W3 컴파일 경우 명시 캐스트 경고를 방지하기 위해 필요한 서명되지 않은. 32 비트 변수에 64 비트 값을 할당 할 수는 있지만 더 작은 변수에 맞게 잘릴 수 있으므로 값을 저장하는 데 32 비트 이상이 필요하면 데이터가 손실 될 수 있습니다.

관련 문제