C言語/標準ライブラリ/limits.h
ヘッダー<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 <limits.h> #include <stdio.h> int main(void) { #ifdef BOOL_WIDTH printf("BOOL_WIDTH = %d\n", BOOL_WIDTH); #else printf("defined(BOOL_WIDTH) == 0\n"); #endif #ifdef CHAR_BIT printf("CHAR_BIT = %d\n", CHAR_BIT); #else printf("defined(CHAR_BIT) == 0\n"); #endif #ifdef USHRT_WIDTH printf("USHRT_WIDTH = %d\n", USHRT_WIDTH); #else printf("defined(USHRT_WIDTH) == 0\n"); #endif #ifdef UINT_WIDTH printf("UINT_WIDTH = %d\n", UINT_WIDTH); #else printf("defined(UINT_WIDTH) == 0\n"); #endif #ifdef ULONG_WIDTH printf("ULONG_WIDTH = %d\n", ULONG_WIDTH); #else printf("defined(ULONG_WIDTH) == 0\n"); #endif #ifdef ULLONG_WIDTH printf("ULLONG_WIDTH = %d\n", ULLONG_WIDTH); #else printf("defined(ULLONG_WIDTH) == 0\n"); #endif #ifdef MB_LEN_MAX printf("MB_LEN_MAX = %d\n", MB_LEN_MAX); #else printf("defined(MB_LEN_MAX) == 0\n"); #endif #ifdef BOOL_MAX printf("BOOL_MAX = %d\n", BOOL_MAX); #else printf("defined(BOOL_MAX) == 0\n"); #endif #ifdef CHAR_MAX printf("CHAR_MAX = %d\n", CHAR_MAX); #else printf("defined(CHAR_MAX) == 0\n"); #endif #ifdef CHAR_MIN printf("CHAR_MIN = %d\n", CHAR_MIN); #else printf("defined(CHAR_MIN) == 0\n"); #endif #ifdef CHAR_WIDTH printf("CHAR_WIDTH = %d\n", CHAR_WIDTH); #else printf("defined(CHAR_WIDTH) == 0\n"); #endif #ifdef INT_MAX printf("INT_MAX = %d\n", INT_MAX); #else printf("defined(INT_MAX) == 0\n"); #endif #ifdef INT_MIN printf("INT_MIN = %d\n", INT_MIN); #else printf("defined(INT_MIN) == 0\n"); #endif #ifdef INT_WIDTH printf("INT_WIDTH = %d\n", INT_WIDTH); #else printf("defined(INT_WIDTH) == 0\n"); #endif #ifdef LONG_MAX printf("LONG_MAX = %ld\n", LONG_MAX); #else printf("defined(LONG_MAX) == 0\n"); #endif #ifdef LONG_MIN printf("LONG_MIN = %ld\n", LONG_MIN); #else printf("defined(LONG_MIN) == 0\n"); #endif #ifdef LONG_WIDTH printf("LONG_WIDTH = %d\n", LONG_WIDTH); #else printf("defined(LONG_WIDTH) == 0\n"); #endif #ifdef LLONG_MAX printf("LLONG_MAX = %lld\n", LLONG_MAX); #else printf("defined(LLONG_MAX) == 0\n"); #endif #ifdef LLONG_MIN printf("LLONG_MIN = %lld\n", LLONG_MIN); #else printf("defined(LLONG_MIN) == 0\n"); #endif #ifdef LLONG_WIDTH printf("LLONG_WIDTH = %d\n", LLONG_WIDTH); #else printf("defined(LLONG_WIDTH) == 0\n"); #endif #ifdef SCHAR_MAX printf("SCHAR_MAX = %d\n", SCHAR_MAX); #else printf("defined(SCHAR_MAX) == 0\n"); #endif #ifdef SCHAR_MIN printf("SCHAR_MIN = %d\n", SCHAR_MIN); #else printf("defined(SCHAR_MIN) == 0\n"); #endif #ifdef SCHAR_WIDTH printf("SCHAR_WIDTH = %d\n", SCHAR_WIDTH); #else printf("defined(SCHAR_WIDTH) == 0\n"); #endif #ifdef SHRT_MAX printf("SHRT_MAX = %d\n", SHRT_MAX); #else printf("defined(SHRT_MAX) == 0\n"); #endif #ifdef SHRT_MIN printf("SHRT_MIN = %d\n", SHRT_MIN); #else printf("defined(SHRT_MIN) == 0\n"); #endif #ifdef UCHAR_MAX printf("UCHAR_MAX = %d\n", UCHAR_MAX); #else printf("defined(UCHAR_MAX) == 0\n"); #endif #ifdef UCHAR_WIDTH printf("UCHAR_WIDTH = %d\n", UCHAR_WIDTH); #else printf("defined(UCHAR_WIDTH) == 0\n"); #endif #ifdef USHRT_MAX printf("USHRT_MAX = %d\n", USHRT_MAX); #else printf("defined(USHRT_MAX) == 0\n"); #endif #ifdef UINT_MAX printf("UINT_MAX = %u\n", UINT_MAX); #else printf("defined(UINT_MAX) == 0\n"); #endif #ifdef ULONG_MAX printf("ULONG_MAX = %lu\n", ULONG_MAX); #else printf("defined(ULONG_MAX) == 0\n"); #endif #ifdef ULLONG_MAX printf("ULLONG_MAX = %llu\n", ULLONG_MAX); #else printf("defined(ULLONG_MAX) == 0\n"); #endif }
- 結果
BOOL_WIDTH = 8 CHAR_BIT = 8 USHRT_WIDTH = 16 UINT_WIDTH = 32 ULONG_WIDTH = 64 ULLONG_WIDTH = 64 MB_LEN_MAX = 16 BOOL_MAX = 1 CHAR_MAX = 127 CHAR_MIN = -128 CHAR_WIDTH = 8 INT_MAX = 2147483647 INT_MIN = -2147483648 INT_WIDTH = 32 LONG_MAX = 9223372036854775807 LONG_MIN = -9223372036854775808 LONG_WIDTH = 64 LLONG_MAX = 9223372036854775807 LLONG_MIN = -9223372036854775808 LLONG_WIDTH = 64 SCHAR_MAX = 127 SCHAR_MIN = -128 SCHAR_WIDTH = 8 SHRT_MAX = 32767 SHRT_MIN = -32768 UCHAR_MAX = 255 UCHAR_WIDTH = 8 USHRT_MAX = 65535 UINT_MAX = 4294967295 ULONG_MAX = 18446744073709551615 ULLONG_MAX = 18446744073709551615
脚註
[編集]- ^ 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> .
- ^ 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> です。
- ^ N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E). ISO/IEC JTC1/SC22/WG14. p. 6, § 4. Conformance ¶6 .
- ^ 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> .
- ^ C11以降、JISCはC99の和訳なので未対応
参考文献
[編集]- 国際標準化機構/国際電気標準会議 ISO/IEC 9899:2018(en) Information technology — Programming languages — C(2018-07-05)