std :: numeric_limits :: digits可以为负数吗?

时间:2014-12-24 00:50:11

标签: c++

2 个答案:

答案 0 :(得分:0)

我想您可以为自己的某个类型添加自己的专精,并加入一个负digits成员。对于原始类型?不可以。标准中的相关位置(截至2011年)为18.3.2.4(8-10):

static constexpr int digits;
     

8可以无变化地表示的radix位数。

     

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

     

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

这些都不可能是负面的。

如果您的实际问题是:&#34;为什么,当digits不能为负时,是签名int?&#34;,那么您的猜测与我的一样好。我的猜测是因为带有签名类型的算术不那么令人惊讶。例如,std::numeric_limits<int>::digits - std::numeric_limits<long>::digits以这种方式不大于零。

答案 1 :(得分:0)

您可以为自己的类型提供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的默认值)。