long long int 대 long int 대 int64_t in C
다음 C 프로그램을 고려하세요.
<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>
32비트 GCC 및 32/64비트 MSVC 컴파일에서 프로그램 출력은 다음과 같습니다.
int: 0 int64_t: 1 long int: 0 long long int: 1
그러나 64비트 GCC 컴파일에서는 출력이 다음과 같이 변경됩니다.
int: 0 int64_t: 1 long int: 1 long long int: 0
이 동작은 64비트 컴파일에서 int64_t가 long long int가 아닌 long int로 정의되기 때문에 발생합니다. 이 문제를 해결하려면 다음과 같이 플랫폼별 검사를 사용할 수 있습니다.
<code class="cpp">#if defined(__GNUC__) && (__WORDSIZE == 64) template <> bool is_int64<long long int>() { return true; } #endif</code>
그러나 이 솔루션은 특정 컴파일러와 플랫폼 조합에 의존하기 때문에 이상적이지 않습니다. 보다 안정적인 방법은 컴파일러에 대한 유형 동등성을 명시적으로 지정하는 것입니다. 불행하게도 C는 기본 데이터 유형 간의 동등성을 정의하는 방법을 제공하지 않습니다. 대신 std::is_same과 같은 유형 특성을 사용할 수 있습니다. 예:
<code class="cpp">// C++11 template <typename T> void same_type(T, T) {} void foo() { long int x; long long int y; same_type(x, y); // Will now compile successfully }</code>
이 예에서 std::is_same은 기본 표현에 관계없이 x와 y가 동일한 유형인지 확인하는 데 사용됩니다.
위 내용은 32비트 컴파일러와 64비트 컴파일러에서 `int64_t`, `long int` 및 `long long int`의 동작이 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!