首頁  >  文章  >  後端開發  >  為什麼 `int64_t`、`long int` 和 `long long int` 的行為在 32 位元和 64 位元編譯器中不同?

為什麼 `int64_t`、`long int` 和 `long long int` 的行為在 32 位元和 64 位元編譯器中不同?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-30 06:39:27446瀏覽

Why Does the Behavior of `int64_t`, `long int`, and `long long int` Differ in 32-bit and 64-bit Compilers?

C 中的long long int 與long int 與int64_t

考慮以下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>

考慮以下C 程式:

int:           0
int64_t:       1
long int:      0
long long int: 1

32位元GCC和32/64位元MSVC編譯中,程式的輸出將是:

int:           0
int64_t:       1
long int:      1
long long int: 0

但是,在64位元GCC編譯中,輸出將改為:

<code class="cpp">#if defined(__GNUC__) && (__WORDSIZE == 64)
template <>
bool is_int64<long long int>() { return true; }
#endif</code>

出現此行為是因為在64 位元編譯中,int64_t 被定義為long int,而不是long long int。為了解決這個問題,我們可以使用特定於平台的檢查,如下所示:

<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>

但是,這個解決方案並不理想,因為它依賴於特定的編譯器和平台組合。更可靠的方法是明確指定編譯器的類型等效項。不幸的是,C 沒有提供一種方法來定義基本資料類型之間的等價性。相反,我們可以依賴類型特徵,例如 std::is_same。例如:

在此範例中,std::is_same 用於確定 x 和 y 是否具有相同的類型,無論其底層表示如何。

以上是為什麼 `int64_t`、`long int` 和 `long long int` 的行為在 32 位元和 64 位元編譯器中不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn