2016-10-07 2 views
1

코드에 부호없는 정수로 size_t을 사용하고 있습니다. 장점은 컴퓨터가 64 비트를 지원하면 size_tunsigned long long int이고, 그렇지 않으면 unsigned int입니다. 내 코드는 32 비트 및 64 비트 플랫폼에서 실행될 수 있습니다.C++ 정수 유형 자동 64 비트

비슷한 부호있는 정수가 있습니까? 플랫폼이 32 비트 만 지원하는 경우 int이고 플랫폼이 64 비트를 지원하면 long long int입니다.

나는 플래그를 설정하여이를 달성 할 수

#ifdef USE_INT64 
    #define MY_INT int 
#else 
    #define MY_INT long long int 
#endif 

그런 MY_INT를 사용합니다. 그러나 USE_INT64을 정의하고이 코드를 모든 코드에 포함해야합니다. size_t과 비슷한 것이 있으면 좋을 것입니다.

+2

대신 'uint64_t'를 사용 하시겠습니까? –

+0

cstdint에는 정수 유형이 많이 있습니다 (http://en.cppreference.com/w/cpp/header/cstdint). 적절한 것을 골라라. –

+1

C++ 11부터 * 모든 * 호환 C++ 컴파일러는 64 비트 정수를 지원합니다. 그렇다면 일부 시스템에서는 32 비트 정수를 사용하고 다른 시스템에서는 64 비트 정수를 사용하는 것이 합리적 일 수 있지만 먼저 선택 방법을 정의해야합니다. ''표준 헤더도 참조하십시오.이 헤더는 정확한 너비를 가진 정수 유형과 적어도 * 지정된 너비를 가진 "빠름"및 "최소"유형을 정의합니다. 'int_fast32_t'는 당신이 원하는 것일 수도 있습니다. –

답변

4

유형을 주소 너비에 직접 연결하려면 찾고있는 유형을 uintptr_tintptr_t이라고합니다. 그들은 C 표준 라이브러리에서 <cstdint>을 통해 상속받습니다.

유형 size_t은 포인터와 크기가 같을 수 있습니다 (일반적으로 작음). 이는 해당 용도로의 사용 가능성이 플랫폼에 따라 다릅니다. (읽기 : 모든 곳에서 작동 할지라도 개념적으로 틀리다.)

물론 실제 질문은 정수 유형을 주소 너비에 연결하는 좋은 근거가 있는지 여부입니다. 그렇지 않다면 uintNN_t/intNN_t typedef를 통해 직접 유형을 정의하고 size_t 등을 잊어 버리는 것이 더 좋은 방법입니다.

+0

@AnT에 감사드립니다. –

0

당신은 std::size_t가 서명을 위해 무엇에 정확한 서명 아날로그를 얻을 수 std::make_signed을 사용할 수

using fancy_signed = std::make_signed<std::size_t>::type; 
1

두 포인터의 차이를 복용에 대해 정의 된 해당 서명 유형 ptrdiff_t 있습니다. size_t과 마찬가지로 포인터와 동일한 크기 여야합니다.

+0

"포인터와 같은 크기"는'uintptr_t'입니다. 구현은 포인터보다'ptrdiff_t' *를 * 크게하여 사용자가 모든 포인터를 뺄 수 있도록 결정할 수 있습니다. 'size_t'는 일반적으로 포인터보다 작습니다 *. – AnT

+0

@AnT'size_t' 또는'ptrdiff_t'가 포인터와 다른 크기의 구현을 보지 못했지만'intptr_t'에 대해서는 전혀 잊어 버렸습니다. 너의 대답에 +1. –

관련 문제