-1是否正确用作无符号整数的最大值?

维克托·波莱沃(Victor Polevoy):

是否有任何c ++标准段落说明为此使用-1可移植且正确的方法,或者正确地执行此操作的唯一方法是使用预定义的值?

我曾与我的同事交谈,更好的是:使用-1最多的无符号整数,或者使用从价值limits.h还是std::numeric_limits

我告诉我的同事,使用limits.h从中使用预定义的最大值std::numeric_limits是这样做的可移植且简洁的方法,但是,该同事反对与-1数字限制一样具有可移植性,并且,它还有一个优点:

unsigned short i = -1; // unsigned short max

可以轻松更改为其他任何类型,例如

unsigned long i = -1; // unsigned long max

使用limits.h头文件中的预定义值时,或者std::numeric_limits还需要将其连同左侧的类型一起重写时。

Picaud Vincent:

不使用标准方式或未清楚表明意图通常是一个坏主意,我们稍后再付款

我会建议:

auto i = std::numeric_limits<unsigned int>::max(); 

或@jamesdin建议一个更好的方式,更接近C习惯:

unsigned int i = std::numeric_limits<decltype(i)>::max(); 

您的同事论点是不可接受的。更改int-> long int,如下所示:

auto i = std::numeric_limits<unsigned long int>::max(); 
  • -1解决方案相比,不需要额外的工作(由于使用auto)。
  • “ -1”解决方案不能直接反映我们的意图,因此可能会产生有害后果。考虑以下代码片段:

using index_t = unsigned int;

... now in another file (or far away from the previous line) ...

const index_t max_index = -1;

首先,我们不明白为什么max_index-1最糟糕的是,如果有人想改进代码并定义

 using index_t = ptrdiff_t;

=>则声明max_index=-1不是max,你会得到一个bug的代码同样,这种情况不会发生,例如:

const index_t max_index = std::numeric_limits<index_t>::max();

注意:使用时仍需注意std::numeric_limits它与整数无关,但与浮点数有关

std::cout << "\ndouble lowest: "
          << std::numeric_limits<double>::lowest()
          << "\ndouble min   : "
          << std::numeric_limits<double>::min() << '\n';

印刷品:

double lowest: -1.79769e+308    
double min   :  2.22507e-308  <-- maybe you expected -1.79769e+308 here!
  • min 返回给定类型的最小有限值
  • lowest 返回给定类型的最小有限值

记住这一点总是很有趣,因为如果我们不注意(使用min代替lowest,它可能是错误的来源

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

控制无符号int的最大值

长整数的最大值

是否将下溢的无符号整数与-1定义明确的整数进行比较?

Rails 4:验证整数的最大值

OverflowError:在python中解析日期时,有符号整数大于最大值

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

整数类型的最大值是否有常数?

是否应将带符号或无符号整数用于大小?

大小相同的整数和浮点值在各自的最小值和最大值之间是否具有相同的粒度?

XPath是否具有最大值?

是否需要使整数文字无符号?

变量是否有最大值?

如何解析包含整数的字符串并检查是否大于c ++中的最大值

无限制计算无符号int最大值的最佳算法.h

是否有一个函数返回最小值和最大值之间的整数?

为什么usize :: max_value()在64位Windows上返回无符号32位整数的最大值?

给定(a,b)计算k的最大值,使得a ^ {1 / k}和b ^ {1 / k}是整数

无符号整数的快速无分支最大值

如何正确添加/加有符号或无符号整数?

最大无符号整数的反向编号

Verilog中无符号7downto0的最大值是多少?

尝试获取无符号long long最大值的位数时的奇怪行为

JodaTime整数最小/最大值解析

为什么32位带符号整数最大值在c#中增加1后变为最小值?

(整数的最大值+ 1)+(整数的最大值+ 1)= 0?

最大值:将函数用作函数参数

无符号字段更新为最大值

PHP 中的数字问题(64 位无符号整数的最大可能值)

理解求和符号中的最大值