문제가 되는 코드들에 대해 예제로 정리된 사이트
http://wiki.kldp.org/wiki.php/32bitCodeTo64bit
개발할 때 이해를 돕는 사이트
http://blog.naver.com/PostView.nhn?blogId=kkpa1002&logNo=20106022381
http://rusy.tistory.com/entry/32%EB%B9%84%ED%8A%B8-vs-64%EB%B9%84%ED%8A%B8-WIN32-vs-WIN64
자료형 |
32 bit OS |
64bit OS |
int |
32 bit (4 Byte) |
32 bit |
short |
16 bit |
16 bit |
long |
32 bit |
64 bit |
longlong |
64 bit |
64 bit |
pointer (*) |
32 bit |
64 bit |
long double |
12 bytes |
16 bytes (128 bit) |
size_t , ssize_t |
32 bit |
64 bit |
typedef |
|
|
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(void)
{
printf("### 1 Byte = 8 bit ###\n");
printf("int : %d byte\n",sizeof(int));
printf("unsigned int : %d byte\n",sizeof(unsigned int));
printf("long int : %d byte\n",sizeof(long int));
printf("unsigned long int : %d byte\n",sizeof(unsigned long int));
printf("long long int : %d byte\n",sizeof(long long int));
printf("float : %d byte\n",sizeof(float));
printf("double : %d byte\n",sizeof(double));
printf("long double : %d byte\n",sizeof(long double));
printf("(void *) : %d byte\n",sizeof(void *));
printf("\n");
printf("INT_MAX = %d\n", INT_MAX);
printf("UINT_MAX = %ud\n", UINT_MAX);
printf("LONG_MAX = %ld\n", LONG_MAX);
printf("ULONG_MAX = %lud\n", ULONG_MAX);
return 0;
}
아래는 64bit에서의 결과의 예제이다.
### 1 Byte = 8 bit ### int : 4 byte unsigned int : 4 byte long int : 8 byte unsigned long int : 8 byte long long int : 8 byte float : 4 byte double : 8 byte long double : 16 byte (void *) : 8 byte INT_MAX = 2147483647 UINT_MAX = 4294967295d LONG_MAX = 9223372036854775807 ULONG_MAX = 18446744073709551615d
몇 가지 유의사항
-
64bit에서는 포인터의 크기와 int의 크기가 다르다. sizeof(void *) != sizeof(int).
-
포인터의 크기가 64bit이기 때문에 그 메모리 주소 연산은 32bit의 환경과 다르게 된다.
-
64bit에서 long 형태의 값을 int 형태로 cast할 때 주의해야 한다. 64bit에서는 sizeof(long)
!= sizeof(int). 그러나 32bit 환경에서는 sizeof(int) == sizeof(long) = 32bit = 4byte.
-
64bit에서 long 형태의 값을 double으로 cast할 때는 정확도의 손실이 생길 수 있다. significant
figure의 갯수가 long 형태와 double 형태가 다르다는 것을 숙지해야 한다.
-
Fortran에서 integer와 real의 기본 크기는 64bit에서도 여전히 32bit = 4byte이므로, 64bit의
integer를 쓰기 위해서는, kind를 이용하거나 아니면 INTEGER*8를 명시해야 한다.
'Languages > cplusplus' 카테고리의 다른 글
지수표기 / enum / new 메모리 할당 (0) | 2012.10.12 |
---|---|
데이터 형변환 (0) | 2012.09.26 |
셔플을 생각하고 구현해 보기 (0) | 2012.09.18 |
[MFC] OnInitDialog 추가하기 (초기화를 위한 작업) (0) | 2012.08.16 |
[MFC] Dialog Box (대화 상자) (0) | 2012.08.09 |