64bit형 변수사용시..
글쓴이: rokmn3309 / 작성시간: 일, 2003/03/30 - 3:41오전
limits.h파일에 보면은
unsigned long long int형의 max값을 보면 184...ULL (20자리) 값이 정의되어 있는데
실제로 변수를 선언하고 값을 입력해봐도.. 10자리에서 짤려버리는데..
컴파일시에 옵션이 있나요???
<code>
int64_t k;
unsigned long long int k2;
k=120120034123776;
k2=120120034123776;
printf("%d\n",k);
printf("%d\n",2);
출력
k -1611210752
k2 -1611210752
</code>
gcc버전은 다음과 같습니다.
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110)
Forums:
잊고 안적은거...
sizeof로 크기를 구해봤을때..
sizeof(int64_t)는 8byte 즉 2에 64승이라고 나옵니다.
근데 실제로 값을 넣으면 sizeof(int) 이상은 오버플로 나버리는 이유가 뭔지..
Re: 64bit형 변수사용시..
printf 안의 %d, %ld, %lld 에 정확히 문법을 따져 주는 것이 compile 하는 것이 좋습니다.
long 형에 대한 것은 %ld 로 해주시고
long long 형은 %lld
unsigned long 은 %lu
unsigned long long 은 %llu
로 해주시어요...
-Wall
을 켜시면 gcc의 경우 printf 안의 인자와 넘기는 것에 대한 형 확인까지 해줍니다.
---
http://coolengineer.com
64비트상수..
한가지 더 빠진것이 있는듯 싶습니다.
printf일 경우에도 물론 조심해야하지만,
64비트 상수정의할 때도 조심하셔야 합니다.
위의 예에서는 그냥 상수를 정의하셨는데 뒤에 ULL혹은 LL
등을 붙여주시는게 portability측면에서 유리합니다.
특히, 이러한 것을 따지는 플랫폼에서는 소스코드는
문제가 없는데, 결과가 이상한 경우가 많이 발생합니다.
대부분의 경우 컴파일러가 컴파일 타임에 LONGLONG상수를
INT 상수로 잘라버리기 때문에 나타납니다.
그럼 이만.
고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.
댓글 달기