2010-08-22 3 views
6

(둘 다에 CentOS이다) I는 다음의 코드 라인 integer constant is too large for ‘long’ type 오류가 32 비트 플랫폼 64 비트에서 전환 후 32 비트 플랫폼에 64 비트 정수 값을 할당 할 수

uint64_t Key = 0x100000000; 

값을 전송해도 도움이되지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

감사

답변

10

당신이 바로 그 타입의 정수 상수를 확인해야합니다. 문제는 0x100000000int으로 해석되고 캐스팅/할당이 도움이되지 않는다는 것입니다. 상수 자체가 int 인 경우 너무 큽니다.

uint64_t Key = UINT64_C(0x100000000); 

이 그것을 할 것입니다 : 상수가 uint64_t 유형 인 지정 할 수 있어야합니다. 사용 가능한 UINT64_C이없는 경우, 시도 : 사실

uint64_t Key = 0x100000000ULL; 

, C99에서 (6.4.4.1p5) :

는 정수 상수의 유형은 해당 목록의 첫 번째

그 값은 표현 될 수있다.

와 접미사가없는 16 진 상수의 목록입니다 : 그래서

int 
long int unsigned int 
long int 
unsigned long int 
long long int 
unsigned long long int 

당신은 C99 모드에서 컴파일러를 호출하는 경우, 당신은 경고를받을 안 (감사 자일스를!).

0

보장하지만, 당신이 시도 할 수는 :

uint64_t Key = 0x100000000ULL; 
4

당신이 작성한 것은 완벽하게 유효한 C99입니다 (#include d <stdint.h>이라고 가정). C99 모드 대신 C89 모드에서 컴파일러를 호출 한 것처럼 보입니다. C89에서는 64 비트 유형을 사용할 수 있다고 보장 할 수는 없지만 일반적인 확장 기능입니다.

Linux를 사용하기 때문에 컴파일러는 아마도 gcc 일 것입니다. Gcc는 C89 모드에서도 모든 플랫폼에서 64 비트 long long을 지원합니다. 하지만 당신은 명시 적으로 long long로 상수를 선언 할 수 있습니다 :

uint64_t Key = 0x100000000ull; 

(lllong long 의미 u가 서명 의미하고, 여기에 선택 사항입니다). 또는 gcc -std=c99으로 g99를 C99 모드로 실행하고 싶을 수 있습니다.

¹ : 언어 변호사의 경우 : 그리고 정확히 64 비트의 정수 유형이 있어야합니다.