C++标准是否要求最大无符号整数的形式为2 ^ N-1?

Vin*_*ent 20 c++ standards unsigned language-lawyer c++11

为了T使std::is_integral<T>::value && std::is_unsigned<T>::valueIS true,不C++标准保证:

std::numeric_limits<T>::max() == 2^(std::numeric_limits<T>::digits)-1
Run Code Online (Sandbox Code Playgroud)

在数学意义上?我正在寻找基于标准引用的证据.

Tar*_*ama 15

我相信这是暗示的[basic.fundamental]/4(N3337):

声明的无符号整数unsigned应遵守算术模数的定律,2^n其中n是该特定整数大小的值表示中的位数.


Ker*_* SB 15

C++通过引用C标准来指定整数类型的范围.C标准说:

对于除了以外的无符号整数类型unsigned char,对象表示的位应分为两组:值位和填充位(不需要后者中的任何一个).如果有N个值位,则每个位应表示1到2 N  -1之间的2的不同幂,因此该类型的对象应能够使用纯二进制表示来表示0到2 N  -1的值; 这应该被称为价值表示.任何填充位的值都未指定.

而且,C++需要:

无符号整数应遵守算术模2 n的定律,其中n是该特定整数大小的值表示中的位数.

综上所述,我们发现无符号整数类型具有n个值位,表示[0,2 n ] 范围内的值,并遵守算术模2 n的定律.