std::numeric_limits<T>:: is_modulo
|
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 となることが要求される |
-
↑
定義は「2つの正の数を加算すると、3番目のより小さい数にラップアラウンドする結果が得られる可能性がある」というものです。これには以下の問題があります:
- ラップアラウンドした値が定義されていない。
- 結果が再現可能かどうかが明記されていない。
- すべての値に対する加算、減算、その他の演算の実行が定義された動作を持つことを要求していない。
関連項目
|
[static]
|
整数型を識別する
(public static member constant) |
|
[static]
|
IEC 559/IEEE 754 浮動小数点型を識別する
(public static member constant) |
|
[static]
|
正確な型を識別する
(public static member constant) |