C++
 Computer >> コンピューター >  >> プログラミング >> C++

C/C++の拡張整数型(intN_t)とは?正しい整数サイズの選び方を解説

このチュートリアルでは、C/C++における拡張整数型(Extended Integral Types)について、実際のサンプルプログラムを交えながら分かりやすく解説します。

C言語のデータ型が抱える「サイズの曖昧さ」

C言語およびC++の組み込み整数型(int や long など)は、その定義が非常に緩やかです。例えば int のサイズは規格上「最低でも16ビット」としか保証されておらず、実際のビット幅はコンパイラやターゲット環境が32ビットか64ビットかによって変化します。

このような環境依存の挙動は、移植性の高いプログラムを書く際に大きな障害になります。そこで役立つのが、必要なビット幅を明示的に指定できる intN_t 系の拡張整数型です。

拡張整数型(intN_t)の種類

intN_t 系の型は、C言語では <stdint.h>、C++では <cstdint> ヘッダーで定義されており、「N」の部分に任意のビット数を当てはめて使用します。主な型は以下の通りです。

  • int8_t / uint8_t:8ビットの符号あり/符号なし整数
  • int16_t / uint16_t:16ビットの符号あり/符号なし整数
  • int32_t / uint32_t:32ビットの符号あり/符号なし整数
  • int64_t / uint64_t:64ビットの符号あり/符号なし整数

サンプルコード

ここでは、8ビットの符号なし整数である uint8_t を使って、その動作を確認してみましょう。

#include <iostream>
using namespace std;

int main(){
    uint8_t i; // ビット幅を8ビットに固定
    i = 0;
    cout << "i の最小値\t: " << (int)i << endl;
    i = 255;
    cout << "i の最大値\t: " << (int)i << endl;
    // 指定したビット幅を超える値を代入すると意図しない結果になる
    i = 2436;
    cout << "範囲外の値を代入した後の i\t: " << (int)i << endl;
    return 0;
}

実行結果

i の最小値 : 0
i の最大値 : 255
範囲外の値を代入した後の i : 132

出力結果の解説

uint8_t は8ビットの符号なし整数のため、扱える値の範囲は 0〜255 です。

ところが、この範囲を大きく超える 2436 を代入すると、値の下位8ビットのみが保持され、132(= 2436 mod 256)というまったく別の値が出力されます。これはいわゆるオーバーフローと呼ばれる現象で、予期せぬバグの原因になるため注意が必要です。

まとめ

環境によって整数型のサイズが変わる問題を回避するには、intN_t 系の拡張整数型を使ってビット幅を明示的に指定するのが最も確実な方法です。特に組み込み開発、ネットワークプロトコルの処理、ファイルフォーマットの入出力など、正確なデータサイズが求められる場面では欠かせない知識といえるでしょう。

  1. Windowsで使えるC++開発向けおすすめIDE 7選

    ```html 大規模なプロジェクトをプレーンなテキストエディターだけで管理するのは困難です。こうしたケースではIDE(統合開発環境)を使った方が、生産性が向上しストレスも大幅に軽減されます。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。ここでは、Windowsで利用できる優れたC/C++向けIDEをご紹介します。 1. Visual Studio Microsoftが開発した定番IDEです。Windows上でのC++プログラムの構築・開発・プロファイリングにおいて、最高クラスのツール群を備えています。豊富なプラグインストアも魅力で、Azure、PowerShe

  2. C++のconstキーワードとは?定数宣言の基本とメリットを解説

    C++におけるconstは、変数を「定数」として宣言するための型修飾子です。const付きで宣言された変数は、一度初期化するとその値を後から変更することができません。 constを使うメリット constを使用する最大の利点は、プログラム内で値が意図せず書き換えられるのを防げることです。例えば、円周率(PI)のような不変の値を扱う場合、プログラムのどの部分からもその値が変更されないようにしたいはずです。このような値はconstとして宣言しておくことで、誤った代入から守ることができます。 コンパイラの最適化との関係 const修飾された型を持つオブジェクトは、コンパイラによって読み取り専用メ