std::numeric_limits<T>::is_modulo

来自cppreference.com
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)
 
 
 
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,除非实现定义有符号整数溢出为回绕。

(C++11 起)

标准特化

T std::numeric_limits<T>::is_modulo 的值
/* 未特化 */ 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

注解

C++ 标准在修复 LWG 问题 2422 前记述“在大多数机器上,这对于有符号整数是 true”。相关讨论参考 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 << "最大值是 " << std::numeric_limits<T>::max() << '\n'
              << "最小值是 " << std::numeric_limits<T>::min() << '\n'
              << "最大值 + 1 是 " << std::numeric_limits<T>::max() + 1 << '\n';
}
 
int main()
{
    check_overflow<int>();
    std::cout << '\n';
    check_overflow<unsigned long>();
//  check_overflow<float>(); // 编译时错误,非模类型
}

可能的输出:

最大值是 2147483647
最小值是 -2147483648
最大值 + 1 是 -2147483648
 
最大值是 18446744073709551615
最小值是 0
最大值 + 1 是 0

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 612 C++98 “以模算术处理溢出”的定义很糟糕[1] 提供更好的定义
LWG 2422 C++11 曾在大多数机器上要求 is_modulo
对有符号整数类型是 true
对有符号整数类型要求是 false
除非定义有符号整数溢出为回绕
  1. 定义是“将两个正数相加的结果可以是回绕到的第三个更小的数”。这个定义有以下几个问题:
    • 它没有定义回绕后的值。
    • 它没有给出回绕是否会复现。
    • 它没有定义对所有值的加、减和其他操作的行为

参阅

[静态]
鉴别整数类型
(公开静态成员常量)
[静态]
鉴别 IEC 559/IEEE 754 浮点类型
(公开静态成员常量)
[静态]
鉴别准确表示的类型
(公开静态成员常量)