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中文網其他相關文章!