C言語/標準ライブラリ/stdckdint.h
表示
整数の検査付き算術演算 <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);
- 説明
- これらのマクロは、
aとbの数学的な値の加算、減算、または乗算を実行し、操作の結果を*resultに格納します(つまり、*resultにはa + b、a - b、またはa * bの計算結果が代入されます)。各操作は、両オペランドが無限の範囲を持つ符号付き整数型で表されているかのように実行され、その後、この整数型からtype1に変換された結果が得られます。 type2およびtype3は、"plain" char、bool、ビット精度の整数型、または列挙型を除く任意の整数型である必要があり、同じである必要はありません。*result は、"plain" char、bool、ビット精度の整数型、または列挙型ではない任意の整数型の修正可能な左辺値(lvalue)でなければなりません。- 推奨される慣習
type2またはtype3が適切な整数型でない場合、または*resultが適切な整数型の修正可能な lvalue でない場合、診断メッセージを生成することが推奨されます。- 戻り値
- これらのマクロが
falseを返す場合、*result に割り当てられた値は操作の数学的結果を正しく表しています。それ以外の場合、これらのマクロはtrueを返します。この場合、*resultに割り当てられた値は、*resultの幅にラップされた操作の数学的結果です。- 例
aとbが signed int 型の値であり、result が signed long 型の場合、ckd_sub(&result, a, b);
- は
a-bをsigned longとして表現できるかどうかを示します。signed longがsigned intよりも幅が広い場合、これは常に可能であり、このマクロはfalseを返します。
歴史
[編集]ヘッダー <stdckdint.h> は、ISO/IEC 9899:2023(通称:C23)で追加される予定。
脚註
[編集]- ^ N3096 working draft — April 1, 2023 ISO/IEC 9899:2023 (E). ISO/IEC JTC1/SC22/WG14. p. 311, §7.20 Checked Integer Arithmetic .