>  기사  >  백엔드 개발  >  64비트 GCC 컴파일에서 `int64_t`가 다르게 동작하는 이유는 무엇입니까?

64비트 GCC 컴파일에서 `int64_t`가 다르게 동작하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-30 19:19:31977검색

Why Does `int64_t` Behave Differently in 64-bit GCC Compiles?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.