기본 콘텐츠로 건너뛰기

MS Windows x64가 LLP64인 까닭

Why did the Win64 team choose the LLP64 model?

Linux/UNIX는 64bit에서 long형이 64bit를 가지지만, Windows는 64bit에서 long형이 32bit를 유지한다. 이유는 호환성 때문이다. Windows에 많이 쓰이는 데이터 타입인 DWORD가 long형이고, 이것을 각종 구조체에서 마음껏 썼기 때문이다. 그래도 하위호환성을 위한 합리적인 선택이라 볼 수 있다. 무턱대고 데이터형 바꾸면 서드파티가 혼란을 겪을 것이고, 숨겨진 새로운 버그를 만들어낼 수도 있기 때문이다.

개인적으로 DWORD랄지, WORD랄지 이런 애매모호한 타입이 마음에 안 들었는데, 나름 쌤통이랄까... 후훗!

참고로 C99표준(stdint.h)에 데이터 크기별로 정수형을 명시적으로 재정의한 타입이 있다. intxx_t과 uintxx_t이다. xx부분에는 데이터 크기가 비트 단위로 들어간다. 예를 들어 8바이트(=64bit) 부호가 없는 정수형은 uint64_t 이다. 이러한 것은 시스템이 1,024bit로 가더라도 그대로 쓸 수 있다.

더불어 intptr_t은 32bit 시스템에서 32bit, 64bit 시스템에서 64bit로 동작한다. = _=) 당연한거지만...


기타 64bit 시스템으로 넘어갈 때 고려해야할 점을 잘 설명한 블로그도 참고로... : http://minjang.egloos.com/2157032

댓글

이 블로그의 인기 게시물

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=...

설치한 패키지에서 RPM 추출하기

오래된 패키지를 관리할 저장소가 없어졌고, 기존 패키지로 다른 서버를 세팅해야할 일이 생겼다면 RPM의 리패키지 기능을 이용해보자. $ rpm -e --repackage [PACKAGE_NAME] 위와 같이 리패키지하면, /var/spool/repackage/ 에 생성한 RPM파일이 있다. :-)