为什么 std::numeric_limits::digits10 是 int 类型的少一个?

Why is std::numeric_limits::digits10 is one less for int types?

为什么 std::numeric_limits<Any Int Type>::digits10 少了一个?

例如std::numeric_limits<int8_t>::digits10 == 2,但是100由三个数字组成。

或者,std::numeric_limits<int64_t>::digits10 == 18,但是INT64_MAX(9'223'372'036'854'775'807)由19位数字组成。

std::numeric_limits<T>::digits10保证 位数,在某种意义上,具有这么多位数的数字可以用类型 T 不会造成信息溢出或丢失

例如std::numeric_limits<int64_t>::digits10 不能是 19,因为 9'223'372'036'854'775'808 有 19 个数字但在 int64_t.

中不能表示

在一般情况下,digits<N> 的这种保证值将始终受到平台上这种 "one less" 差异的影响,其中 digits<N> 不是用于内部表示的 radix 的幂.在非特殊情况下 radix 为 2。由于 10 不是 2 的幂,因此 digits10 比最大值的长度小 1。

如果 std::numeric_limits<T> 包括 digits16digits8 这些值对于 radix 2 平台将是 "precise"。

numeric_limits::digits的定义如下:

std::numeric_limits::digits10的值是类型T可以不改变地表示的10进制数字的个数,即任何有这么多十进制数字的数字都可以转换为类型 T 的值并返回十进制形式,不会因舍入或溢出而发生变化。

这意味着 int8_t 是 2 位数字,因为有些 3 位数字不能用 int8_t(即 999)

表示