对于T
以便std::is_integral<T>::value && std::is_unsigned<T>::value
为true
,C ++标准是否保证:
std::numeric_limits<T>::max() == 2^(std::numeric_limits<T>::digits)-1
在数学意义上?我正在寻找基于标准引用的证据。
答案 0 :(得分:15)
我相信[basic.fundamental]/4
(N3337)隐含着这一点:
声明为
unsigned
的无符号整数应遵守算术模2^n
的算法,其中n
是数字 特定大小整数的值表示中的位数。
答案 1 :(得分: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 的规律。