Namespaces
Variants

std::numeric_limits<T>:: is_modulo

From cppreference.net
Utilities library
static const bool is_modulo ;
(C++11まで)
static constexpr bool is_modulo ;
(C++11以降)

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

is_modulo は符号付き整数型の場合 false です。ただし、実装が符号付き整数のオーバーフローをラップするように定義している場合は除きます。

目次

標準特殊化

T std:: numeric_limits < T > :: is_modulo の値
/* non-specialized */ false
bool false
char 実装定義
signed char 実装定義
unsigned char true
wchar_t 実装定義
char8_t (C++20以降) true
char16_t (C++11以降) true
char32_t (C++11以降) true
short 実装定義
unsigned short true
int 実装定義
unsigned int true
long 実装定義
unsigned long true
long long (C++11) 実装定義
unsigned long long (C++11) true
float false
double false
long double false

注記

標準規格は、LWG issue 2422の解決以前には「ほとんどのマシンにおいて、これは符号付き整数について true である」と記述していました。関連する議論については LWG issue 2422 および GCC PR 22200 を参照してください。

モジュロ型の動作を実演します:

#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 << "max 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>();
    std::cout << '\n';
    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

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 612 C++98 「オーバーフローをモジュロ演算で扱う」の定義が不十分だった [1] より適切な定義を提供
LWG 2422 C++98 is_modulo はほとんどのマシンで符号付き整数型に対して true となることが要求されていた 符号付き整数のオーバーフローがラップアラウンドすると定義されていない限り、
符号付き整数型に対して false となることが要求される
  1. 定義は「2つの正の数を加算すると、3番目のより小さい数にラップアラウンドする結果が得られる可能性がある」というものです。これには以下の問題があります:
    • ラップアラウンドした値が定義されていない。
    • 結果が再現可能かどうかが明記されていない。
    • すべての値に対する加算、減算、その他の演算の実行が定義された動作を持つことを要求していない。

関連項目

[static]
整数型を識別する
(public static member constant)
[static]
IEC 559/IEEE 754 浮動小数点型を識別する
(public static member constant)
[static]
正確な型を識別する
(public static member constant)