ホームページ > バックエンド開発 > C++ > `long int` が C の `int64_t` のように動作する場合があるのはなぜですか?

`long int` が C の `int64_t` のように動作する場合があるのはなぜですか?

Barbara Streisand
リリース: 2024-10-30 22:45:18
オリジナル
533 人が閲覧しました

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 long ではなく、long int として定義されます。 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>
ログイン後にコピー

ただし、これはハック的な解決策です。コンパイラに型の等価性を指定する方法はありますか?

残念ながら、 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート