C言語/標準ライブラリ/stdckdint.h

出典: フリー教科書『ウィキブックス(Wikibooks)』


整数の検査付き算術演算 <stdckdint.h>[編集]

<stdckdint.h> ヘッダーは、C言語の標準ライブラリの一部であり、検査付き整数の算術演算を実行するためのいくつかのマクロを定義しています[1]

__STDC_VERSION_STDCKDINT_H__マクロは、202311Lに相当する値を持つ整数定数式です。

整数演算マクロ ckd_[編集]

概要
#include <stdckdint.h>
bool ckd_add(type1 *result, type2 a, type3 b);
bool ckd_sub(type1 *result, type2 a, type3 b);
bool ckd_mul(type1 *result, type2 a, type3 b);
説明
これらのマクロは、ab の数学的な値の加算、減算、または乗算を実行し、操作の結果を *result に格納します(つまり、*result には a + ba - b、または a * b の計算結果が代入されます)。各操作は、両オペランドが無限の範囲を持つ符号付き整数型で表されているかのように実行され、その後、この整数型から type1 に変換された結果が得られます。
type2 および type3 は、"plain" char、bool、ビット精度の整数型、または列挙型を除く任意の整数型である必要があり、同じである必要はありません。*result は、"plain" char、bool、ビット精度の整数型、または列挙型ではない任意の整数型の修正可能な左辺値(lvalue)でなければなりません。
推奨される慣習
type2 または type3 が適切な整数型でない場合、または *result が適切な整数型の修正可能な lvalue でない場合、診断メッセージを生成することが推奨されます。
戻り値
これらのマクロが false を返す場合、*result に割り当てられた値は操作の数学的結果を正しく表しています。それ以外の場合、これらのマクロは true を返します。この場合、*result に割り当てられた値は、*result の幅にラップされた操作の数学的結果です。
ab が signed int 型の値であり、result が signed long 型の場合、
ckd_sub(&result, a, b);
a - bsigned long として表現できるかどうかを示します。signed longsigned int よりも幅が広い場合、これは常に可能であり、このマクロは false を返します。

歴史[編集]

ヘッダー <stdckdint.h> は、ISO/IEC 9899:2023(通称:C23)で追加される予定。

脚註[編集]

  1. ^ N3096 working draft — April 1, 2023 ISO/IEC 9899:2023 (E). ISO/IEC JTC1/SC22/WG14. p. 311, §7.20 Checked Integer Arithmetic . https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3096.pdf.