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

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

ヘッダー<limits.h> では、標準的な整数型のさまざまな限界値やパラメータに展開するマクロがいくつか定義されています。標準的な整数型のさまざまな制限やパラメータに展開するいくつかのマクロを定義しています[1][2]

<limits.h> は、フリースタンディング環境で使える標準ライブラリの1つです[3]

マクロ[編集]

以下に示す値は、#if 前処理ディレクティブで使用するのに適した定数式で置き換えられます。実装で定義された値は、表示された値と同じかそれ以上でなければならない[4]

BOOL_WIDTH
_Bool型のオブジェクトの幅C23
CHAR_BIT
ビットフィールドではない(バイト)最小のオブジェクトのビット数
名前に反して char ではなくバイトのビット数であることに注意。
CHAR_BITは、C99では定義されているのに、JISCでは定義されていない

char型、signed char型、unsigned char型の幅を表すマクロCHAR_WIDTH、SCHAR_WIDTH、UCHAR_WIDTHは、CHAR_BITと同じ値に展開しなければなりません。

USHRT_WIDTH
unsigned short int 型のオブジェクトの幅
SHRT_WIDTH
short int 型のオブジェクトの幅
USHRT_WIDTH と同じ値に展開されます。
UINT_WIDTH
unsigned int 型のオブジェクトの幅
INT_WIDTH
int型の幅
UINT_WIDTH と同じ値に展開されます。
ULONG_WIDTH
unsigned long int 型のオブジェクトの幅
LONG_WIDTH
long int 型の幅
ULONG_WIDTH と同じ値に展開されます。
ULLONG_WIDTH
unsigned long int 型のオブジェクトの幅
LLONG_WIDTH
long long int 型の幅
ULLONG_WIDTH と同じ値に展開されます。
MB_LEN_MAX
マルチバイト文字の最大バイト数(サポートされているすべてのロケールにおいて)

すべての符号なし整数型に対して、<limits.h> または <stdint.h> で幅 を表す接尾辞 _WIDTH を持つマクロが定義されています。 その型で表現可能な最大値 を保持する接尾辞 _MAX を持つマクロがあります(符号なし整数の最小値が 0 であることは自明)。

すべての符号付き整数型に対して、<limits.h> または <stdint.h> で幅 を表す接尾辞 _WIDTH を持つマクロが定義されています。 最小値 および最大値 を表す接尾辞 _MIN および _MAX を持つマクロがあります。 これらのマクロは型で表現可能で、#if前処理ディレクティブでの使用に適しており、また対応する型のオブジェクトを整数の昇格則に従って変換した式と同じ型を持ちます。

char型のオブジェクトが負の値を保持できる場合、CHAR_MINの値はSCHAR_MINと同じになり、CHAR_MAXの値はSCHAR_MAXと同じになります。それ以外の場合は、CHAR_MINの値は0とし、CHAR_MAXの値はUCHAR_MAXと同じとします。

概要[編集]

ヘッダー <limits.h> の内容を以下に示します。 値はすべて定数式で,#if 前処理ディレクティブで使用するのに適しています。 (以下のマクロでは、表示されている最小値は、実装で定義された値に置き換えるものとする)

以下のマクロでは、表示されている最小値は、実装で定義された値に置き換える必要があります[5]

<limits.h>の例(その1)
#define BOOL_WIDTH    1
#define CHAR_BIT      8
#define USHRT_WIDTH  16
#define UINT_WIDTH   16
#define ULONG_WIDTH  32
#define ULLONG_WIDTH 64
#define MB_LEN_MAX    1

以下のマクロでは、表示されている最小の大きさは、前節で示されているように、上記のマクロから推測される同一符号の実装定義の大きさに置き換えられます。

<limits.h>の例(その2)
#define BOOL_MAX                      1 // 2^BOOL_WIDTH − 1
#define CHAR_MAX              UCHAR_MAX //or SCHAR_MAX
#define CHAR_MIN                      0 // or SCHAR_MIN
#define CHAR_WIDTH                    8 // CHAR_BIT
#define INT_MAX                  +32767 // 2^INT_WIDTH−1 − 1
#define INT_MIN                  -32768 // −2^INT_WIDTH − 1
#define INT_WIDTH                    16 // UINT_WIDTH
#define LONG_MAX            +2147483647 // 2^LONG_WIDTH−1 − 1
#define LONG_MIN            -2147483648 // −2^LONG_WIDTH−1
#define LONG_WIDTH                   32 // ULONG_WIDTH
#define LLONG_MAX  +9223372036854775807 // 2^LLONG_WIDTH−1 − 1
#define LLONG_MIN  -9223372036854775808 // −2^LLONG_WIDTH − 1
#define LLONG_WIDTH                  64 // ULLONG_WIDTH
#define SCHAR_MAX                  +127 // 2^SCHAR_WIDTH−1 − 1
#define SCHAR_MIN                  -128 // −2^SCHAR_WIDTH − 1
#define SCHAR_WIDTH                   8 // CHAR_BIT
#define SHRT_MAX                 +32767 // 2 ^SHRT_WIDTH−1 − 1
#define SHRT_MIN                 -32768 // −2^SHRT_WIDTH−1
#define UCHAR_MAX                   255 // 2^UCHAR_WIDTH − 1
#define UCHAR_WIDTH                   8 // CHAR_BIT
#define USHRT_MAX                 65535 // 2^USHRT_WIDTH − 1
#define UINT_MAX                  65535 // 2^UINT_WIDTH − 1
#define ULONG_MAX            4294967295 // 2^ULONG_WIDTH − 1
#define ULLONG_MAX 18446744073709551615 // 2^ULLONG_WIDTH − 1
参考
#include <stdio.h>
#include <limits.h>

int main(void)
{
#ifdef BOOL_WIDTH
printf("BOOL_WIDTH = %zu\n", BOOL_WIDTH);
#else
printf("defined(BOOL_WIDTH) == 0\n");
#endif
#ifdef CHAR_BIT
printf("CHAR_BIT = %zu\n", CHAR_BIT);
#else
printf("defined(CHAR_BIT) == 0\n");
#endif
#ifdef USHRT_WIDTH
printf("USHRT_WIDTH = %zu\n", USHRT_WIDTH);
#else
printf("defined(USHRT_WIDTH) == 0\n");
#endif
#ifdef UINT_WIDTH
printf("UINT_WIDTH = %zu\n", UINT_WIDTH);
#else
printf("defined(UINT_WIDTH) == 0\n");
#endif
#ifdef ULONG_WIDTH
printf("ULONG_WIDTH = %zu\n", ULONG_WIDTH);
#else
printf("defined(ULONG_WIDTH) == 0\n");
#endif
#ifdef ULLONG_WIDTH
printf("ULLONG_WIDTH = %zu\n", ULLONG_WIDTH);
#else
printf("defined(ULLONG_WIDTH) == 0\n");
#endif
#ifdef MB_LEN_MAX
printf("MB_LEN_MAX = %zu\n", MB_LEN_MAX);
#else
printf("defined(MB_LEN_MAX) == 0\n");
#endif
#ifdef BOOL_MAX
printf("BOOL_MAX = %zu\n", BOOL_MAX);
#else
printf("defined(BOOL_MAX) == 0\n");
#endif
#ifdef CHAR_MAX
printf("CHAR_MAX = %zu\n", CHAR_MAX);
#else
printf("defined(CHAR_MAX) == 0\n");
#endif
#ifdef CHAR_MIN
printf("CHAR_MIN = %zu\n", CHAR_MIN);
#else
printf("defined(CHAR_MIN) == 0\n");
#endif
#ifdef CHAR_WIDTH
printf("CHAR_WIDTH = %zu\n", CHAR_WIDTH);
#else
printf("defined(CHAR_WIDTH) == 0\n");
#endif
#ifdef INT_MAX
printf("INT_MAX = %zu\n", INT_MAX);
#else
printf("defined(INT_MAX) == 0\n");
#endif
#ifdef INT_MIN
printf("INT_MIN = %zu\n", INT_MIN);
#else
printf("defined(INT_MIN) == 0\n");
#endif
#ifdef INT_WIDTH
printf("INT_WIDTH = %zu\n", INT_WIDTH);
#else
printf("defined(INT_WIDTH) == 0\n");
#endif
#ifdef LONG_MAX
printf("LONG_MAX = %zu\n", LONG_MAX);
#else
printf("defined(LONG_MAX) == 0\n");
#endif
#ifdef LONG_MIN
printf("LONG_MIN = %zu\n", LONG_MIN);
#else
printf("defined(LONG_MIN) == 0\n");
#endif
#ifdef LONG_WIDTH
printf("LONG_WIDTH = %zu\n", LONG_WIDTH);
#else
printf("defined(LONG_WIDTH) == 0\n");
#endif
#ifdef LLONG_MAX
printf("LLONG_MAX = %zu\n", LLONG_MAX);
#else
printf("defined(LLONG_MAX) == 0\n");
#endif
#ifdef LLONG_MIN
printf("LLONG_MIN = %zu\n", LLONG_MIN);
#else
printf("defined(LLONG_MIN) == 0\n");
#endif
#ifdef LLONG_WIDTH
printf("LLONG_WIDTH = %zu\n", LLONG_WIDTH);
#else
printf("defined(LLONG_WIDTH) == 0\n");
#endif
#ifdef SCHAR_MAX
printf("SCHAR_MAX = %zu\n", SCHAR_MAX);
#else
printf("defined(SCHAR_MAX) == 0\n");
#endif
#ifdef SCHAR_MIN
printf("SCHAR_MIN = %zu\n", SCHAR_MIN);
#else
printf("defined(SCHAR_MIN) == 0\n");
#endif
#ifdef SCHAR_WIDTH
printf("SCHAR_WIDTH = %zu\n", SCHAR_WIDTH);
#else
printf("defined(SCHAR_WIDTH) == 0\n");
#endif
#ifdef SHRT_MAX
printf("SHRT_MAX = %zu\n", SHRT_MAX);
#else
printf("defined(SHRT_MAX) == 0\n");
#endif
#ifdef SHRT_MIN
printf("SHRT_MIN = %zu\n", SHRT_MIN);
#else
printf("defined(SHRT_MIN) == 0\n");
#endif
#ifdef UCHAR_MAX
printf("UCHAR_MAX = %zu\n", UCHAR_MAX);
#else
printf("defined(UCHAR_MAX) == 0\n");
#endif
#ifdef UCHAR_WIDTH
printf("UCHAR_WIDTH = %zu\n", UCHAR_WIDTH);
#else
printf("defined(UCHAR_WIDTH) == 0\n");
#endif
#ifdef USHRT_MAX
printf("USHRT_MAX = %zu\n", USHRT_MAX);
#else
printf("defined(USHRT_MAX) == 0\n");
#endif
#ifdef UINT_MAX
printf("UINT_MAX = %zu\n", UINT_MAX);
#else
printf("defined(UINT_MAX) == 0\n");
#endif
#ifdef ULONG_MAX
printf("ULONG_MAX = %zu\n", ULONG_MAX);
#else
printf("defined(ULONG_MAX) == 0\n");
#endif
#ifdef ULLONG_MAX
printf("ULLONG_MAX = %zu\n", ULLONG_MAX);
#else
printf("defined(ULLONG_MAX) == 0\n");
#endif
}
結果
defined(BOOL_WIDTH) == 0
CHAR_BIT = 8
defined(USHRT_WIDTH) == 0
defined(UINT_WIDTH) == 0
defined(ULONG_WIDTH) == 0
defined(ULLONG_WIDTH) == 0
MB_LEN_MAX = 16
defined(BOOL_MAX) == 0
CHAR_MAX = 127
CHAR_MIN = 4294967168
defined(CHAR_WIDTH) == 0
INT_MAX = 2147483647
INT_MIN = 2147483648
defined(INT_WIDTH) == 0
LONG_MAX = 9223372036854775807
LONG_MIN = 9223372036854775808
defined(LONG_WIDTH) == 0
LLONG_MAX = 9223372036854775807
LLONG_MIN = 9223372036854775808
defined(LLONG_WIDTH) == 0
SCHAR_MAX = 127
SCHAR_MIN = 4294967168
defined(SCHAR_WIDTH) == 0
SHRT_MAX = 32767
SHRT_MIN = 4294934528
UCHAR_MAX = 255
defined(UCHAR_WIDTH) == 0
USHRT_MAX = 65535
UINT_MAX = 4294967295
ULONG_MAX = 18446744073709551615
ULLONG_MAX = 18446744073709551615

脚註[編集]

  1. ^ N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E). ISO/IEC JTC1/SC22/WG14. p. 185, §7.10 Characteristics of integer types <limits.h>. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf. 
  2. ^ C18(ISO/IEC 9899:2018) までは章タイトルが、§7.10 Sizes of integer types <limits.h> でしたが、C23からは §7.10 Characteristics of integer types <limits.h> (仮訳: 整数型の特徴)となりました。JIS C(JIS X 3010:2003 C11+TC1:2001相当の和訳)では、7.10 整数型の大きさ<limits.h> です。
  3. ^ N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E). ISO/IEC JTC1/SC22/WG14. p. 6, § 4. Conformance ¶6. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf. 
  4. ^ N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E). ISO/IEC JTC1/SC22/WG14. p. 20, §5.2.4.2.1 Characteristics of integer types <limits.h>. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf. 
  5. ^ C11以降、JISCはC99の和訳なので未対応

参考文献[編集]