C言語でプログラミングを行う際、Windows APIなどのライブラリを使用しているとしばしば「WORD」というデータ型に遭遇します。

しかし、標準のC言語仕様には「WORD」というキーワードは存在しません。

そのため、一体何バイトなのか、どのような定義になっているのか疑問に思う方も多いでしょう。

本記事では、WORD型の正体とそのバイト数、環境による違い、そして実行環境で実際にサイズを確認する方法について詳しく解説します。

WORD型とは何か?C言語における定義の正体

C言語の標準規格(C99やC11など)において、intcharといった基本データ型は定義されていますが、WORD型は標準の予約語ではありません。

WORD型は主にMicrosoft WindowsのSDK(Software Development Kit)において、ヘッダーファイル内で定義されている独自のデータ型です。

Windows環境におけるWORDの定義

Windowsのプログラミング環境では、windef.hなどのヘッダーファイルの中で、typedefを用いて以下のように定義されています。

C言語
typedef unsigned short WORD;

このように、WORDは「符号なしの短精度整数型(unsigned short)」として定義されているのが一般的です。

C言語のプログラム内でWORDを使用するためには、windows.hなどのヘッダーファイルをインクルードする必要があります。

歴史的な背景:なぜ「WORD」と呼ばれるのか

「WORD(ワード)」という言葉は、もともとコンピュータのCPUが一度に処理できる情報の単位を指します。

16ビットCPUの時代(Intel 8086など)において、CPUのレジスタサイズが16ビットであったため、16ビット(2バイト)が1つの「語(WORD)」として扱われていました。

その後、32ビット、64ビットとCPUのアーキテクチャは進化しましたが、Windows APIにおいては互換性を維持するために「WORD = 16ビット(2バイト)」という定義が固定されました。

現代の64ビット環境であっても、WindowsのプログラミングにおけるWORD型は依然として2バイトを指します。

WORDとその関連型のバイト数一覧

Windowsプログラミングの世界には、WORDの他にも「DWORD」や「QWORD」といったサイズに関連する型が存在します。

これらはすべてビット数やバイト数が固定されており、データ構造の定義やAPIの引数などで頻繁に使用されます。

WORD、DWORD、QWORDのサイズ比較

以下に、Windows環境でよく使われるサイズ定義済みの型とそのバイト数、対応する標準C言語の型をまとめます。

型の名前意味ビット数バイト数標準C言語での主な定義
BYTEバイト8ビット1バイトunsigned char
WORDワード16ビット2バイトunsigned short
DWORDダブルワード32ビット4バイトunsigned long
QWORDクアッドワード64ビット8バイトunsigned long long

DWORDは「Double Word」の略であり、WORDの2倍(32ビット)を意味します。

同様にQWORDは「Quad Word」の略で、WORDの4倍(64ビット)を意味します。

これらの型は、ネットワーク通信のパケット構造体やバイナリファイルのフォーマット定義において、データの大きさを厳密に制御したい場合に非常に便利です。

sizeof演算子を用いたバイト数の確認方法

C言語には、指定した型や変数がメモリ上で占有するサイズをバイト単位で取得するためのsizeof演算子が用意されています。

環境によって型サイズが異なる可能性があるため、実際の開発現場では「sizeof」を使って動的にサイズを確認するのが最も安全です。

実行環境でWORDのサイズを確認するプログラム

以下のコードは、Windows環境でWORDおよびその関連型のサイズを表示するサンプルプログラムです。

C言語
#include <stdio.h>
#include <windows.h> // WORD型の定義を使用するために必要

int main(void) {
    // sizeof演算子を使用して各型のバイト数を取得
    printf("WORD型のサイズ: %zu バイト\n", sizeof(WORD));
    printf("DWORD型のサイズ: %zu バイト\n", sizeof(DWORD));
    printf("BYTE型のサイズ: %zu バイト\n", sizeof(BYTE));

    // 変数に対しても使用可能
    WORD myData = 0;
    printf("変数myDataのサイズ: %zu バイト\n", sizeof(myData));

    return 0;
}
実行結果
WORD型のサイズ: 2 バイト
DWORD型のサイズ: 4 バイト
BYTE型のサイズ: 1 バイト
変数myDataのサイズ: 2 バイト

このプログラムを実行すると、WORDが2バイトであることが確認できます。

なお、printf関数の書式指定子に%zuを使用しているのは、sizeofの戻り値がsize_t型であるためです。

非Windows環境でのWORD型

Windows以外の環境(LinuxやmacOSなど)で開発を行っている場合、windows.hは存在しません。

そのため、単にWORDと記述してもコンパイルエラーとなります。

もし他プラットフォームでWORDという名称を使いたい場合は、自身で以下のようにtypedefを行う必要があります。

C言語
typedef unsigned short WORD;

ただし、後述するように現代のC言語では、より移植性の高い書き方が推奨されています。

環境による「ワードサイズ」の違いに注意

技術的な文脈において、「ワード(Word)」という言葉には2つの側面があることに注意しなければなりません。

1. ソフトウェア定義としてのWORD

先述した通り、Windows APIなどのソフトウェアフレームワークが定義する「WORD」です。

これはプラットフォームが32ビットから64ビットに移行しても、互換性のために16ビット(2バイト)として固定されています。

2. ハードウェア本来のワードサイズ

CPUアーキテクチャにおける「ワードサイズ」です。

これはCPUのレジスタ幅やデータバスの幅を指します。

  • 32ビットCPU(x86など)の場合:ワードサイズは32ビット(4バイト)
  • 64ビットCPU(x64, ARM64など)の場合:ワードサイズは64ビット(8バイト)

C言語の標準型であるint型は、多くの場合そのCPUのワードサイズに合わせて設計されます(ただし、現代の64ビット環境の多くではintは依然として32ビットのままです)。

このように、「コンピュータ科学用語としてのワード」と「C言語のソースコード上のWORD型」は必ずしも一致しないという点に留意してください。

より安全で汎用的な代替手段:stdint.hの使用

現代のC言語(C99以降)において、特定のバイト数を保証したい場合には、stdint.hヘッダーで定義されている「固定幅整数型」を使用することが推奨されます。

固定幅整数型とは

stdint.hをインクルードすると、環境に依存せずビット数が明示された型を使用できるようになります。

WORD型の代替として以下の型がよく使われます。

  • uint16_t(符号なし16ビット整数):WORDに相当
  • uint32_t(符号なし32ビット整数):DWORDに相当
  • uint64_t(符号なし64ビット整数):QWORDに相当

サンプルコード:stdint.hの活用

C言語
#include <stdio.h>
#include <stdint.h> // 固定幅整数型の定義

int main(void) {
    // uint16_tは必ず16ビット(2バイト)になる
    uint16_t wordData = 65535;
    uint32_t dwordData = 4294967295U;

    printf("uint16_tのサイズ: %zu バイト\n", sizeof(uint16_t));
    printf("uint32_tのサイズ: %zu バイト\n", sizeof(uint32_t));

    return 0;
}
実行結果
uint16_tのサイズ: 2 バイト
uint32_tのサイズ: 4 バイト

Windows APIを直接呼び出すプログラムであれば、APIのシグネチャに合わせてWORDを使用するのが適切です。

しかし、OSに依存しない汎用的なライブラリや計算ロジックを記述する場合は、uint16_tなどを使用する方が移植性は高まります。

WORD型を使用する際のメモリ配置とアライメント

バイト数を理解する上で、もう一つ重要な概念が「アライメント(境界調整)」です。

WORD型(2バイト)を構造体の中で使用する場合、コンパイラは処理の効率化のためにパディング(隙間)を挿入することがあります。

構造体におけるサイズの挙動

例えば、以下のような構造体を考えてみましょう。

C言語
#include <stdio.h>
#include <windows.h>

struct MyStruct {
    BYTE  a; // 1バイト
    WORD  b; // 2バイト
};

int main(void) {
    printf("構造体MyStructのサイズ: %zu バイト\n", sizeof(struct MyStruct));
    return 0;
}

理論上は「1バイト + 2バイト = 3バイト」ですが、多くの環境では4バイトと表示されます。

これは、WORD型のデータをメモリアドレスの偶数境界に配置しようとするアライメント調整が働くためです。

バイナリデータの解析やネットワーク通信で、厳密に2バイトとして詰め込みたい場合は、#pragma packなどのコンパイラ独自の指示子を使用してアライメントを抑制する必要があります。

まとめ

C言語におけるWORD型の正体は、主にWindows環境で定義されている「符号なし16ビット整数(unsigned short)」であり、そのサイズは2バイトです。

本記事のポイントを振り返ると以下の通りです。

  • WORDは2バイト、DWORDは4バイト、QWORDは8バイトとして定義されている。
  • 標準C言語の予約語ではなく、windows.hなどでtypedefされている。
  • 歴史的な経緯(16ビットCPU時代)からこの名称が使われているが、現代の64ビット環境でも2バイトのまま固定されている。
  • バイト数を確実に知るにはsizeof(WORD)を使用する。
  • 移植性を重視する場合は、stdint.huint16_tを使用するのが望ましい。

WORD型のバイト数を正しく理解し、sizeofや固定幅整数型を適切に使い分けることで、バグの少ない堅牢なプログラムを記述できるようになります。

特に、ハードウェアに近い低レイヤーのプログラミングや、Windowsデスクトップアプリの開発においては必須の知識と言えるでしょう。