32 ビット コンパイラと 64 ビット コンパイラで「int64_t」、「long int」、および「long long int」の動作が異なるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-10-30 06:39:27
オリジナル
456 人が閲覧しました

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>
ログイン後にコピー

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>
ログイン後にコピー

この例では、基礎となる表現に関係なく、x と y が同じ型であるかどうかを判断するために std::is_same が使用されます。

以上が32 ビット コンパイラと 64 ビット コンパイラで「int64_t」、「long int」、および「long long int」の動作が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!