首頁 > 後端開發 > C++ > 主體

為什麼「long int」有時會表現得像 C 中的「int64_t」?

Barbara Streisand
發布: 2024-10-30 22:45:18
原創
443 人瀏覽過

Why does `long int` sometimes behave like `int64_t` in C  ?

C 中的 Long Long Int 與 Long Int 與 Int64_t

使用 C 類型特徵時,可能會遇到一些奇怪的行為。考慮以下程序:

<code class="c++">#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 位元編譯中,輸出符合預期:

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的定義不同所造成的:

<code class="c++"># if __WORDSIZE == 64
typedef long int  int64_t;
# else
__extension__
typedef long long int  int64_t;
# endif</code>
登入後複製

64位元模式下,int64_t被定義為long int,而不是long long int。

要解決此問題,可以將 is_int64 模板專門用於 long long int:

<code class="c++">#if defined(__GNUC__) && (__WORDSIZE == 64)
template <>
bool is_int64<long long int>() { return true; }
#endif</code>
登入後複製

但是,這是一種 hackish 解決方案。有沒有辦法指定編譯器的類型等效性?

不幸的是,這在 C/C 中是不可能的。編譯器定義基本資料類型等效性,而 typedef 僅採用一種方式。

另一種解決方法是使用類型特徵來檢查類型的屬性,而不是依賴它們的確切名稱:

<code class="c++">template <typename T>
struct some_type_trait : boost::false_type { };

template <>
struct some_type_trait<int64_t> : boost::true_type { };

// Usage
if (some_type_trait<long int>::value) {
    // ...
}</code>
登入後複製

這種方法允許在不顯式比較類型的情況下檢查類型屬性。

以上是為什麼「long int」有時會表現得像 C 中的「int64_t」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!