'64비트 정수 표현'에 해당되는 글 1건

  1. 2007.11.26 enum 의 Type과 표현 범위 3
http://baboc.tistory.com/49

위 글에서 enum 이 #define 을 대신하여 상수 정의 용도로 사용할 수 있다는 것을 썼다.
물론 #define 도 미리 정해진 타입이 없긴 하지만
사람들은 암묵적으로 4바이트 정수 타입으로 인식하고 있는 듯 하다.

enum 으로 선언된 상수들은 일반적으로 signed int 형을 갖게 되는데,
엄밀히 말하자면, 4바이트 정수형 이하의 타입 중에 항당 된 값을 가장 optimal 하게 표현하는
자료형을 갖게 된다.
다만, 4바이트 정수 이하 타입들의 기본 연산자가 모두 일반 int 형 연산자를 사용하므로
그것이 그렇게 중요한 사항은 아니다.

문제는 다음과 같이 signed int 의 범위를 벗어난 값을 할당하려고 할 때이다.
enum{
    TWO_GIGA_BYTE = 2*1024*1024*1024,
}

위와 같이 선언하면 의도한 대로 값이 할당되지 않는다.
다음과 같이 캐스팅을 하면,
#ifdef _WIN32
typedef unsigned __int64  uint64;
#elif defined(__linux__)
typedef unsigned long long uint64;
#endif

enum{
    TWO_GIGA_BYTE = uint64(2)*1024*1024*1024,
}

타입이 변환되는 것처럼 보인다.
나의 테스트 결과 linux 에서는 아무런 문제 없이 의도한 대로 값이 할당된다.
하지만 windows 위 VC++ 6.0, VC++ 7.0 에서는 위와 같이 하여도 제대로 된 값이 할당 되지 않는다.
온갖 테스트를 다 해 보았지만, 결국 성공하지 못 했다.
아마도 이쪽 컴파일러가 64비트 정수의 타입 변환에 대해 별 다른 처리를 해 주지 않은 게 아닐까 생각된다.
결국, signed int 범위를 벗어난 범위에 대해서는 linux 환경에서만 쓸 수 있다는 것이다.
나는 linux 와 win32 환경에서 모두 돌아가는 코드를 작성해야 하므로,
이 경우에는 결국 다른 선택 없이 const 변수를 사용해야만 한다.

아 ... -_-;;
그동안 enum 으로 정의한 상수를 대부분 사용하여 왔는데,
이렇게 되면 코드의 일관성이 떨어지는 결과를 낳게 된다.
물론 const 정수를 사용한 코드도 많지만 ...
일부는 시즈모드 일부는 퉁퉁퉁퉁퉁 !!!

====

<추가 테스트>

typedef unsigned int  uint32;

enum{
    TWO_GIGA_BYTE = uint32(2)*1024*1024*1024,
}

void function()
{
    uint32 i = TWO_GIGA_BYTE;
    print(i);
}

위와 같이 32비트 unsigned int 타입으로 선언하고 값을 받으면 잘 된다.
결국 win32 환경에서 32비트 타입까지는 잘 지원한다는 얘기 !
: