Section 01: Win32 vs Win64
- Win32와 Win64는 마이크로소프트 Windows 운영 체제에서 사용되는 두 가지 중요한 프로그래밍 인터페이스(API)입니다. 이들은 각각 32비트와 64비트 시스템 아키텍처를 대상으로 합니다. 이 섹션에서는 두 시스템 간의 주요 차이점과 그들이 프로그래밍에 미치는 영향에 대해 살펴보겠습니다.
Win32 vs Win64의 주요 차이점
- 데이터 처리 능력
- Win32
- 32비트 시스템에서는 한 번에 32비트의 데이터를 처리합니다.(4바이트)
- Win64
- 64비트 시스템에서는 한 번에 64비트의 데이터를 처리할 수 있습니다. 이는 더 큰 데이터 블록을 효율적으로 처리할 수 있음을 의미합니다.(8바이트)
- 주소값 표현의 확장
- Win32
- 32비트 주소 체계를 사용하여, 메모리 주소의 범위(4GB)가 제한됩니다.
- Win64
- 64비트 주소 체계를 사용하여, 훨씬 더 큰 메모리 주소 공간을 활용할 수 있습니다. 이는 프로그래머가 더 큰 메모리 영역을 활용할 수 있게 하며, 대규모 데이터를 효과적으로 처리할 수 있도록 돕습니다.
- 자료형의 다형성(Polymorphism):
- Win64
- Polymorphic 자료형의 도입으로, 환경과 상황에 따라 자료형의 의미가 유동적으로 변할 수 있습니다. 예를 들어, LONGPTR, ULONGPTR, INT_PTR, UINT_PTR 등이 이에 해당합니다. 이러한 자료형은 32비트 시스템과 64비트 시스템 간의 호환성을 유지하면서, 시스템 특성에 맞게 최적화된 성능을 제공합니다.
- 호환성과 성능:
- Win32
- 오래된 시스템과의 호환성 유지에 중점을 두며, 32비트 애플리케이션에 적합합니다.
- Win64
- 더 높은 성능과 확장된 메모리 관리 기능을 제공합니다. 64비트 애플리케이션 개발에 적합하며, 더 큰 데이터 집합과 복잡한 계산을 처리하는 데 유리합니다.
결론
- Win32와 Win64는 각각의 시스템 아키텍처에 맞추어 최적화된 성능과 기능을 제공합니다.
- 프로그래머는 자신이 작업하는 시스템의 요구사항과 성능 기대치를 고려하여 적절한 API를 선택해야 합니다.
- Win64는 현대적인 컴퓨팅 환경에서의 대규모 데이터 처리와 복잡한 계산을 위한 강력한 도구로 자리매김하고 있습니다.
Section 02: 프로그램 구현 관점에서의 WIN32 vs WIN64
LLP64 vs LP64
- LP64와 LLP64는 64비트 시스템에서 사용되는 두 가지 주요 데이터 모델입니다.
- LP64 모델
- 대부분의 Unix시스템에서 사용되며, 여기서 'long'은 4바이트이고 'pointer'는 64비트입니다.
- LLP64 모델
- Windows에서 사용되며, 'long'과 'pointer'가 64비트입니다.
64비트와 32비트 공존의 문제점
- 64비트 시스템에서는 32비트 시스템과 호환성을 유지하면서도 더 큰 메모리 주소 공간과 데이터 처리 능력을 제공합니다.
- 그러나 32비트와 64비트 코드 간의 상호 운용성 문제가 발생할 수 있으며, 이는 특히 주소값이나 데이터 크기가 중요한 경우 문제가 됩니다.
#include <stdio.h?
int main(void)
{
int arr[10] ={ 0, };
int arrVal = (int)arr;
printf("pointer : %d \n", arrVal);
}
- 1번에서는 64비트 Windows LLP64가 기본 모델이므로 int는 4바이트 포인터는 8바이트다 위 예제는 그래서 형 변환 과정에서 데이터 손실이 발생할 수 있다.
첫번쨰 결론 : 64비트 시스템에서는 포인터가 지니고 있는 주소값을 4바이트 정수형으로 형 변환하지말자
Windows 스타일 자료형
- Windows API는 고유한 스타일의 자료형을 사용합니다 (예: DWORD, HANDLE 등).
- 이러한 자료형들은 Windows 프로그래밍에서 일관성과 호환성을 유지하는 데 중요합니다.
- WINDOWS 자료형


두번쨰 결론: 유니코드와 아스키코드를 공통으로 지원하도록 예제를 작성하되, 64비트 시스템에서 새롭게 정의된 자료형은 가급적 사용하지 않겠다.
Windows 자료형 확인하기
Polymorphic 자료형
- Windows에서 WIN64 기반으로 이동하면서 도입되었습니다.
- 이 자료형은 상황과 환경에 따라 다른 의미를 가질 수 있으며, 32비트 시스템에서는 32비트로, 64비트 시스템에서는 64비트로 선언됩니다.
- 이는 32비트와 64비트 시스템 간의 호환성을 높이는데 중요한 역할을 합니다.
- 개발 과정에서 이 자료형을 직접 선언하는 일은 드물지만, Windows에서 제공하는 시스템 함수 중 많은 부분이 이 자료형을 기반으로 구현되어 있습니다
- 조건부 컴파일
- _WIN32와 WIN64를 기반으로 상황에 맞게 적절히 컴파일 되도록 함수를 구현하는 것이다.
#if defined(_WIN64)
UINT64 CalDistance(UINT64 a, UINT64 b)
#else
UINT CalDistance(UINT a, UINT b)
#endif
{
return a - b;
}
Section 03: 오류의 확인
GetLastError 함수와 에러코드
- 프로그래밍 과정에서 오류가 발생하는 것은 피할 수 없는 일입니다.
- 중요한 것은 발생한 오류의 원인을 파악하고 해결하는 능력입니다.
- Windows 시스템 프로그래밍에서는 GetLastError 함수가 핵심적인 역할을 합니다.
- GetLastError 함수의 중요성
- 오류 발생시 대응: Windows 시스템 함수를 호출하는 과정에서 오류가 발생하면, GetLastError 함수를 호출하여 해당 오류의 원인을 파악할 수 있습니다.
- 이 함수는 마지막으로 발생한 오류 코드를 반환합니다.
DWORD GetLastError(void);
- unsigned long과 동일합니다.
- 오류 코드의 이해
- GetLastError 함수가 반환하는 오류 코드를 이해하고 해석하는 것은 프로그래밍 과정에서 발생하는 문제를 효율적으로 해결하는 데 필수적입니다.
오류 코드의 활용
- 오류 코드 확인
- 프로그램이 예상치 못한 방식으로 동작할 때, GetLastError를 호출하여 반환된 오류 코드를 확인합니다.
- 이 코드는 MSDN과 같은 문서에서 해당 오류의 상세한 설명과 해결 방법을 찾는 데 사용될 수 있습니다.
- 디버깅 및 문제 해결
- GetLastError 함수를 통해 얻은 오류 코드는 프로그램의 버그를 해결하고 시스템의 정확한 동작을 보장하는 데 중요한 정보를 제공합니다.
Syetem Programming Project Design
1차 23.12.26
2차 23.12.27
3차 23.12.28
4차 23.12.29
5차 24.01.02
6차 24.01.03