C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[18025] 64비트 CPU에서 Integer의 크기는?
미노 [wyb330] 7972 읽음    2010-04-07 12:36
질문성의 글이 될 수도 있지만 Integer 타입은 CPU나 운영체제에 따라서
크기가 달라지는 걸로 알고 있습니다.
그래서 64비트 CPU/운영체제에서는 Integer 타입의 크기가 64비트일 걸로
생각하고 있는데 델파이 도움말에서는 크기가 32비트인 걸로 못박혀 있어서
도움말이 잘못 되어 있는건지 아니면 제가 잘못 이해하고 있는지 헷갈립니다.

진실은 무엇일까요?
Lyn [tohnokanna]   2010-04-07 12:52 X
컴파일러 마음대로.
미노 [wyb330]   2010-04-07 12:56 X
그러니까 컴파일러의 맘을 알고 싶다는거죠...
civilian [civilian]   2010-04-07 13:11 X
델파이는 32비트 컴파일러니까 Integer는 32비트가 되겠죠.

델파이 for 64비트가 나온다면 정수형은 64비트가 될거구요.
소리바람.OJ [phonon]   2010-04-07 13:13 X
Int64라는 64비트 전용타입이 있습니다.
32비트의 호환을 위해서 Integer는 4바이트입니다.
참고로,
유닉스의 경우는 integer가 기본 32비트로 설정되어 있는 것과 64비트로 설정되어 있는 나누어져 있습니다.
아마, 64비트 운영체제가 완전히 보급되기 전에는 이런 과도기적 혼란은 계속 될 것으로 봅니다.

--------------------------------------------------------------------------------------
Type  Storage size                        Range           

Byte       1                             0 to 255
ShortInt   1                          -127 to 127
Word       2                             0 to 65,535
SmallInt   2                       -32,768 to 32,767
LongWord   4                             0 to 4,294,967,295
Cardinal   4*                            0 to 4,294,967,295
LongInt    4                -2,147,483,648 to 2,147,483,647
Integer    4*               -2,147,483,648 to 2,147,483,647
Int64      8    -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807

Single     4     7  significant digits, exponent   -38 to +38
Currency   8    50+ significant digits, fixed 4 decimal places
Double     8    15  significant digits, exponent  -308 to +308
Extended  10    19  significant digits, exponent -4932 to +4932
--------------------------------------------------------------------------------------
류종택 [ryujt]   2010-04-07 13:30 X
전 다른 이야기로,
크기가 문제되는 넘들은 Integer대신 DWord를 사용합니다.
Cardinal의 경우에도 나중에 컴파일러가 변했을 때,
그 크기를 확신할 수 없습니다.

사실 린군 말대로,
정수형이든 어떤 변수든 컴파일러 설계자 맘이긴 하죠.
지금이라도 128비트 정수형이 필요하면 문제없이 만들 수 있으니..

물론
앞으로 64비트 델파이가 나오면 정수형 기본은 64비트일 확률이 높겠죠.
아니면, int64가 있으니 내비둘 확률도 ㅡ.ㅡ;

루비같은 경우에는 그 한계가 없다고 본거 같기도 하고.

제 기억이 맞다면,
8비트 PC 시절에도 integer 형은 16비트였던 것으로 기억합니다.
(물론 레지스터 크기의 영향이겠지만 AX, BX, CX, DX ..)
Lyn [tohnokanna]   2010-04-07 13:41 X
64bit 델파이가 나오기 전까지는 모르죠 ㅡ.ㅡ 아직 나오지도 않았는데 노스트라다무스도 아니고 미래를 예측해야하나요.

지금까지 나온 AMD64용 윈도우 C++ 컴파일러(VC++, ICC) 는 일단 int 는 32bit입니다.
써본지 오래되었지만 MinGW 에서 gcc로 빌드했을땐 int 가 64bit엿구요
Lyn [tohnokanna]   2010-04-07 13:47 X
http://www.unix.org/whitepapers/64bit.html

윈도우용(적어도 현재까진)은 위의 표에서 LLP64 모델을 따르고 있고
유닉스(아마도 리눅스도)는 LP64 모델을 따릅니다.

근데 리눅스에서 만들어져 윈도우로 포팅된놈들(MinGW GCC 등) 은 LP64로 유지되는 것 같구요.
Lyn [tohnokanna]   2010-04-07 13:54 X
현재 상황으로 봐서는 델파이도 integer 의 크기가 32bit로 고정될 가능성이 높지 않나 싶네요. 소스관리하기 편하고
미노 [wyb330]   2010-04-07 14:10 X
Integer나 Cardinal 타입은 CPU나 운영체제의 정수형에 최적화를 위해 나온 타입이니만큼 CPU/운영체제가 64비트라면
그에 맞춰서 Integer형도 64비트가 되어야 하는게 원래 설계 목적에 맞다고 봅니다. 64비트를 지원하는 델파이가 나오더라도
CPU/운영체제가 32비트라면 32비트가 되는게 맞지않을까요?
CPU나 운영체제와 관계없는 정수형을 사용할 때는 Int32나 Int64를 사용하면 되니깐요.
Lyn [tohnokanna]   2010-04-07 14:35 X
64bit로 빌드하면 32bit에선 안돌아갑니다 =_=a

32bit로 빌드하면 64bit 에서도 32bit 호환모드로 돌아가구요
Lyn [tohnokanna]   2010-04-07 14:39 X
만약 64bit 로 integer 의 크기가 변환되면 파일에 저장한 데이터를 불러오거나 할때 "64bit의 동작이 고려되지 않은(대부분이 그렇겟죠? 아직까지 델파이는 64bit로 만들 수 없으니)" 코드를 전부 수정해야 하는 오버헤드가 있죠

하지만 int 의 크기가 변하지 않는다면 오히려 문제가 없구요.
Lyn [tohnokanna]   2010-04-07 14:42 X
그리고 최신 컴파일러에서는 변수를 선언햇을때 띄엄띄엄 배치하기 때문에 16bit, 나 32bit 정수형 에서의 속도 감소도 나타나지 않구요..
라스코니 [chouoo]   2010-04-07 15:49 X
LP64(Long integer와 Pointer 는 64 비트라는 뜻)와 LLP64(Long long integer 와 Pointer가 64 비트라는 뜻) 를 보시면 됩니다.

LP64는 리눅스 진영에서 가장 많이 사용되는 것이고요,
LLP64는 MS 윈도우 진영에서 밀고 있는 것입니다.

따라서 어떤 64 bit OS에서도 int는 32 bit 입니다.
64 비트 리눅스에서는 long int 는 64 bit 이지만, 64 비트 MS 윈도우에서는 여전히 32 bit 입니다.

64 bit OS에서도 float/double 는 32bit OS 에서와 마찬가지로 4 byte/8 byte의 사이즈를 갖습니다.
미노 [wyb330]   2010-04-07 15:58 X
정수형은 플랫폼에 의존적인 Integer형과 고정된 크기의 다른 정수형으로 구별했기 때문에 플랫폼이 바뀌면 Integer의
크기도 바뀌는 게 원래 의도에 맞다고 봅니다. 그리고 호환 문제는 실수형에도 이미 발생했는데 예전 Real형이 지금은
Double형으로 바뀌어서 $RealCompatibility 컴파일러 지시자를 이용하면 예전 소스를 별 수정없이 사용할 수 있습니다.
Lyn [tohnokanna]   2010-04-07 16:10 X
아 그러네요... LP64에서도 int 는 32bit 이군요. 잘못알았네요.
long = int 라는 잘못된 인식이 머리에 박혀있었던듯..
김상구.패패루 [peperu]   2010-04-07 16:32 X
VC의 경우 64비트 환경에서 크기가 변하는 타입은 다음과 같습니다.
- 각종 포인터 (당근 HANDLE 포함)
- size_t
- 윈도우 Message 파라미터들 (LPARAM, WPARAM 등등)

덕분에 성능 최적화를 배제하고 단순히 64비트로 컴파일만 되게 변경하는 것은 그닥 어렵지 않습니다.
이경문 [gilgil]   2010-04-07 17:51 X
64bit 컴파일러에서 Stack에 push/pop할 때 쓰이는 기본 단위는 몇 바이트가 되는가요?
Lyn [tohnokanna]   2010-04-07 18:47 X
확인해보니 8바이트네요.
이경문 [gilgil]   2010-04-07 20:17 X
Lyn / 음.. 역시... 그렇다면 64bit 환경에서 32bit 데이터(예 : int32)를 Stack에 넘기려면 확장 작업을 해야 한다는 거군요(CBW, CWD와 같은 assembly 명령을 이용해서).
Lyn [tohnokanna]   2010-04-07 21:36 X
이경문 // 아뇨 위에서 16bit, 32bit 형을 사용할때 속도감소가 없다고 했는데..
애초에 변수를 8바이트 단위로 배치 해 둿기 때문에, 그냥 스택에다가 데이터를 8바이트 어치 mov 해 버립니다. 추가적인 오퍼레이션이 발생 하지 않아요.

이경문 [gilgil]   2010-04-07 21:47 X
Lyn / 아, 그렇겠군. 즉 uint32라고 변수 type을 선언해도 컴파일러가 알아서(속도 최적화를 위해서) 저장 크기를 64bit로 할당해서 사용한다는 얘기 맞나?
이경문 [gilgil]   2010-04-07 21:48 X
음.. 그렇다면 64bit로 컴파일하면 실행 파일 및 실행할 때 메모리 차지하는 것은 좀 커지겠군...
Lyn [tohnokanna]   2010-04-07 22:08 X
이경문 // Call 방식에 의한 차이도 크구요...(스택 처리가 함수밖에 있으니)

메모리는 8바이트 잡아놓고 연산은 4바이트 명령어 쓰면 되니까요.... 근데 애초에 64bit 쓰는 이유가 무한에 가까운 메모리를 사용하기 위함이니 좀 메모리 더먹는거정도는 얼마든지 봐줄 수 있음.. 먹어바야 얼마나 더먹겠음

+ -

관련 글 리스트
18025 64비트 CPU에서 Integer의 크기는? 미노 7972 2010/04/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.