2011-02-18 5 views
6

이 프로그램은 WindowsXP 시스템의 VC++ 6.0으로 작성되었습니다.__int64 변수를 직접 -2500000000으로 설정할 수없는 이유는 무엇입니까?

__int64 변수를 직접 -2500000000으로 설정하려고하면 32 비트 값으로 잘리고 2의 보수가 취해집니다.

__int64 testval; 
testval = -2500000000; 

이 시점에서 testval은 1794967293 (110 1010 1111 1101 0000 0111 0000 0000 바이너리)과 같습니다. I 부정적인 의해 곱셈 후 2,500,000,000에 변수를 설정하고

, 그것은 작동 : 가변 testVal에가 (0,101 0,000 0,010 1,111 1,001 0,000 0,000 이진 1,001) -2500000000 동일

__int64 testval; 
testval = 2500000000; 
testval *= -1; 

.

아이디어가 있으십니까? 감사합니다. .

+3

MSVC6? 아야! 그 상처! –

답변

10

최신 컴파일러를 구하십시오. VC6 표준 준수가 매우 좋지 않습니다. VC6에서

,

__int64 toobig = -2500000000i64; 

the documentation 발견 같이 i64의 접미사를 시도!

+0

고마워요, 그게 선호하는 방법이지만, 지금은 옵션이 아닙니다. –

+0

@E : VC6에 대한 해결책이 있다고 생각하지만 더 이상 테스트 할 수있는 곳에 복사본이 설치되어 있지 않습니다. –

+0

그게 작동합니다. 감사! 그것들은 문서에서 __int64에 대한 링크가 필요합니다. –

9

컴파일러는 상수 2500000000을 32 비트 숫자로 처리합니다. 상수의 끝에 LL을 추가하여 명시 적으로이를 long int으로 처리하도록 알려야합니다.

testval = -2500000000LL;

업데이트을 : 그래서, 대신 시도 컴파일러가이 기능을 지원하지 않기 때문에, 당신은 VC6에 붙어있는 두 개의 32 비트 숫자의 제품으로의 결과 값으로 그것을 깨는 대신 시도 in :

testval = -250000; 
testval *= 10000;
+1

아마도'L'보다는'LL'이 될 가능성이 더 높습니다. –

+0

그 (리터럴에 32 비트 타입을 사용하는 컴파일러)는 C++ 0x 섹션'[lex.icon]'을 위반했습니다. C++ 03 또는 C++ 98의 표현? –

+2

C++ 03은 90 년대 후반에 출시 된 Visual C++ 6을 고려할 때 아마도 도움이되지 않을 것입니다. – ChrisV

2

올바른 구문은 -2500000000LL입니다. 작동하지 않으면 최신 컴파일러를 얻으십시오.