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

时间:2016-01-18 15:53:20

标签: c++ c++11 standards language-lawyer unsigned

对于T以便std::is_integral<T>::value && std::is_unsigned<T>::valuetrue,C ++标准是否保证:

std::numeric_limits<T>::max() == 2^(std::numeric_limits<T>::digits)-1

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

2 个答案:

答案 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 的规律。