std::numeric_limits::d igits 可以是负数吗?

Can std::numeric_limits::digits be negative?

本文关键字:igits numeric limits std      更新时间:2023-10-16

http://en.cppreference.com/w/cpp/types/numeric_limits/digits

这个值可以为负吗?

我想你可以为自己的类型之一添加自己的专业化,并输入一个负digits成员。对于基元类型?不。标准中的相关位置(截至2011年)是18.3.2.4(8-10):

static constexpr int digits;

8 无需更改即可表示的 radix 位数。

9 对于整数类型,表示中无符号位的数量

10 对于浮点类型,指尾数中的radix位数。

这些都不可能是负面的。

如果你的实际问题是:"为什么,当digits不能是负面的时,它是一个签名int?"那么你的猜测和我的一样好。我的猜测是,这是因为有符号类型的算术并不那么令人惊讶。例如,std::numeric_limits<int>::digits - std::numeric_limits<long>::digits以这种方式不大于零。

您可以为自己的类型提供专用std::numeric_limits (§[namespace.std]/1):

除非另有说明,否则如果C++程序将声明或定义添加到命名空间 std 或命名空间 std 中的命名空间,则未定义它的行为。仅当声明依赖于用户定义的类型并且专用化满足原始模板的标准库要求且未明确禁止时,程序才能将任何标准库模板的模板专用化添加到命名空间 std

似乎没有任何语言禁止负数,例如§[limits.numeric]中的位数,如果它存在,这就是你所期望的地方。另一方面,负数也没有任何意义,并且很明显与字段的描述背道而驰,即使没有直接规定该数字是非负数。

不过,std::numeric_limits<T>::digits产生值 0 是完全可能和合理的。事实上,对于大多数非算术类型(§[numeric.limits]/1),它基本上是必需的:

The default numeric_limits<T> template shall have all members, but with 0 or false 
values.

一些最初看起来像算术类型的东西实际上并非如此。举一个明显的例子,std::complex<T>不是算术类型。

底线:我希望所有内置类型的位数都是严格的正数。尽管没有什么可以直接禁止用户定义类型的负值,但似乎这样的值必须是一个错误 - 如果该值是算术值,则位数应严格为正数,如果不是算术值,则不应为该类型提供std::numeric_limits专用化(在这种情况下,将使用值为 0 的默认值)。