C의 Long Long Int 대 Long Int 대 Int64_t
C 유형 특성은 특히 부호 있는 64비트에서 이상한 동작을 보일 수 있습니다. 정수 유형. 이유는 다음과 같습니다.
32비트 및 64비트 컴파일(GCC 및 MSVC) 모두에서 다음 프로그램은 예상대로 작동합니다.
<code class="cpp">#include <iostream> #include <cstdint> template <typename T> bool is_int64() { return false; } template <> bool is_int64<int64_t>() { return true; } int main() { std::cout << "int:\t" << is_int64<int>() << std::endl; std::cout << "int64_t:\t" << is_int64<int64_t>() << std::endl; std::cout << "long int:\t" << is_int64<long int>() << std::endl; std::cout << "long long int:\t" << is_int64<long long int>() << std::endl; return 0; }</code>
출력에서는 int64_t가 올바르게 표시됩니다. , long int 및 long long int는 모두 동등한 64비트 정수 유형입니다.
그러나 64비트 GCC 컴파일은 다른 결과를 생성합니다.
int: 0 int64_t: 1 long int: 1 long long int: 0
이 놀라운 동작은 다음에서 비롯됩니다. int64_t의 C 표준 라이브러리 정의:
<code class="cpp"># if __WORDSIZE == 64 typedef long int int64_t; # else __extension__ typedef long long int int64_t; # endif</code>
64비트 컴파일에서 int64_t는 long long int가 아닌 long int로 정의됩니다. 이는 int64_t를 확인하는 is_int64() 템플릿 특수화가 long long int 대신 long int와 일치한다는 것을 의미합니다.
부분 템플릿 특수화를 사용하는 솔루션:
이 문제를 해결하려면 문제가 발생하면 부분 템플릿 특수화를 사용하여 long long int에 대해 is_int64()를 명시적으로 정의할 수 있습니다.
<code class="cpp">#if defined(__GNUC__) && (__WORDSIZE == 64) template <> bool is_int64<long long int>() { return true; } #endif</code>
그러나 이 솔루션은 컴파일러에 따라 다르며 영향을 받는 모든 유형에 대해 구현하는 것이 지루할 수 있습니다.
Boost를 사용하는 대체 솔루션:
Boost는 Boost::is_same 가변 템플릿을 사용하여 더욱 우아한 솔루션을 제공합니다.
<code class="cpp">#include <boost/type_traits/is_same.hpp> template <typename T> bool is_int64_boost() { return boost::is_same<T, int64_t>::value; } int main() { std::cout << "int:\t" << is_int64_boost<int>() << std::endl; std::cout << "int64_t:\t" << is_int64_boost<int64_t>() << std::endl; std::cout << "long int:\t" << is_int64_boost<long int>() << std::endl; std::cout << "long long int:\t" << is_int64_boost<long long int>() << std::endl; return 0; }</code>
이 접근 방식은 표준 라이브러리의 정확한 표현에 관계없이 모든 동등한 64비트 정수 유형입니다.
위 내용은 64비트 GCC 컴파일에서 `int64_t`가 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!