名前空間
変種
操作

std::numeric_limits::is_modulo

提供: cppreference.com
 
 
 
型サポート
型プロトタイプ
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(C++20以前)
(C++11)(C++20で非推奨)
(C++11)
型特性定数
メタ関数
(C++17)
エンディアン
(C++20)
サポートされている操作
関係と性質の問い合わせ
(C++11)
(C++11)
型変更
(C++11)(C++11)(C++11)
型変換
(C++11)
(C++11)
(C++17)
(C++11)(C++20以前)(C++17)
 
 
static const bool is_modulo;
(C++11以前)
static constexpr bool is_modulo;
(C++11およびそれ以降)

std::numeric_limits<T>::is_modulo の値は、モジュロ算術を用いてオーバーフローを処理するすべての算術型に対して true になります。 つまり、その型の加減乗除の結果が範囲 [min(), max()] の外側になった場合、そのような演算の戻り値は期待される値と max()-min()+1 の倍数だけ異なります。

目次

[編集] 標準の特殊化

T std::numeric_limits<T>::is_modulo の値
/* 非特殊化 */ false
bool false
char 処理系定義
signed char 処理系定義
unsigned char true
wchar_t 処理系定義
char16_t 処理系定義
char32_t 処理系定義
short 処理系定義
unsigned short true
int 処理系定義
unsigned int true
long 処理系定義
unsigned long true
long long 処理系定義
unsigned long long true
float false
double false
long double false

[編集] ノート

C++11 標準はいまだに「ほとんどのマシンでは、この値は符号付き整数型に対して true です」と言っていますが、正確な文言は C++03 から C++11 の間で変更され、 true の値はもはや符号付き整数のオーバーフローにおける未定義動作と互換性がななくなりました (「可能性がある」から厳格な要件に変更されました)。 それにより、 (最適化の機会のために) 符号付きのオーバーフローが未定義であることに頼る処理系は、符号付き整数型に対する is_modulofalse に設定するようになりました。 例としては GCC PR 22200 を参照してください。

標準の文言は LWG issue 2422 で「処理系がラップする符号付き整数のオーバーフローを定義しない限り、 is_modulo は符号付き整数型に対して false です」に変更されることが期待されています。

[編集]

モジュロ型の動作をデモンストレーションします。

#include <iostream>
#include <type_traits>
#include <limits>
 
template<class T>
typename std::enable_if<std::numeric_limits<T>::is_modulo>::type
    check_overflow()
{
    std::cout << "\nmax value is " << std::numeric_limits<T>::max() << '\n'
              << "min value is " << std::numeric_limits<T>::min() << '\n'
              << "max value + 1 is " << std::numeric_limits<T>::max()+1 << '\n';
}
 
int main()
{
    check_overflow<int>();
    check_overflow<unsigned long>();
    // check_overflow<float>(); // compile-time error, not a modulo type
}

出力例:

max value is 2147483647
min value is -2147483648
max value + 1 is -2147483648
 
max value is 18446744073709551615
min value is 0
max value + 1 is 0

[編集] 関連項目

[static]
整数型を識別します
(パブリック静的メンバ定数) [edit]
[static]
IEC 559/IEEE 754 の浮動小数点型を識別します
(パブリック静的メンバ定数) [edit]
[static]
正確な型を識別します
(パブリック静的メンバ定数) [edit]