Windows에서 __int64를 long으로 변환하는 방법 (MSVC8 & MSVC6)?Windows에서 __int64를 long으로 변환
정상적인 유형 캐스팅이 작동합니까?
또한 long을 __int64로 변환하는 방법은 무엇입니까? long이 음의 값이면 작동할까요?
주 - __int64 변수에 항상 32 비트를 넘지 않는 값이 포함되는 시나리오에 대해 이야기하고 있습니다.
Windows에서 __int64를 long으로 변환하는 방법 (MSVC8 & MSVC6)?Windows에서 __int64를 long으로 변환
정상적인 유형 캐스팅이 작동합니까?
또한 long을 __int64로 변환하는 방법은 무엇입니까? long이 음의 값이면 작동할까요?
주 - __int64 변수에 항상 32 비트를 넘지 않는 값이 포함되는 시나리오에 대해 이야기하고 있습니다.
1. 변환
가 __int64
키워드 MSDN에 Acorrding __int64 긴 :
_ _int64 키워드가 새 유형을 선언, 64 비트 (8 바이트) 정수 . int, short 및 long 형식을 사용하면 _ _int64 형식에 해당 서명되지 않은 버전이 있으므로 두 가지 유형을 만들 때 _키워드를 실제로 사용할 수 있습니다.
는다음 코드 샘플 두 개의 64 비트 정수 번 서명과 다른 서명으로 선언하는 방법을 보여준다 :
__int64 signed_big_int 단계; 서명되지 않은 __int64 unsigned_big_int;
__int64
signed __int64
지원 부정적인 긴도 타입 캐스트없이 물론
__int64
에
long
를 할당 할 수 낭포는
long
보다 넓게해야한다. 긴
단지 전용 데이터의 손실의 pssibility의 저를 경고 msvc8 data.My을 잃어버린의 가능성, long
에 __int64
변환 확인되는
2. 변환 __int64.
3 주 :
C99은 당신이 그들을 사용하지만 __int64
한다, 당신은 휴대용 코드를 제공 할 .If stdint.h
에 int64_t
및 서명되지 않은 버전 uint64_t
라는 이름의 표준 64 비트 정수 유형을 정의. C++ 프로그래밍 언어에서 표준 64 비트 정수이 존재하지 않는
공지 사항, MSVC는 __int64
를 사용하지만 리눅스 세계에서 일반적 C99의 stdint.h
라도 좋습니다에 long long
또는 unsigned long long
으로 정의 유형 int64_t
또는 uint64_t
내가 당신의 C를 가정 사용 ++ 컴파일러는 stdint.h
헤더 파일을 지원합니다.
그렇습니다. __int64 값이 항상 long의 범위 내에 있음을 보장 할 수 있다면 타입 캐스팅이 좋을 것입니다. 다른 방향, 즉 long에서 int64로 캐스팅하는 것은 관련된 값에 관계없이 문제가되지 않습니다.
다음은 작은 테스트입니다.
#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
또는 /W3
컴파일 경우 명시 캐스트 경고를 방지하기 위해 필요한 서명되지 않은. 32 비트 변수에 64 비트 값을 할당 할 수는 있지만 더 작은 변수에 맞게 잘릴 수 있으므로 값을 저장하는 데 32 비트 이상이 필요하면 데이터가 손실 될 수 있습니다.