繁体   English   中英

小于最小可表示 int 的最小 int 值?

[英]Smallest int value that is smaller than the smallest representable int?

如果T是整数类型,则std::numeric_limits<T>::infinity()返回 0。 我可以使用这个 function 的替代品吗? 我有一系列 int 变量(它们可以是int8, uint8, int32, uint32, int64, uint64 ),它们可以取最小值(含)和最大值(含)之间的任何值。

我需要一个小于所有这些变量的值,这个值将用于比较目的(我将比较这个值是否小于我的一系列 int 变量)。

我知道我可以像-std::numeric_limits<double>::infinity()这样的东西,但是如果我要将我的 int 变量与这个值进行比较,比较将以 FP 精度进行,我担心性能的影响。 理想情况下,我希望所有比较都使用整数进行。

我认为我们可以拥有的最小 int 值是std::numeric_limits<int64_t>::minimum() ,所以我认为我的问题本质上是在问我们是否可以获得比这更小的 integer 值?

您可以定义自己的负无穷常数,它比较小于任何其他值。

这对于C++20 的三向比较器(又名宇宙飞船)来说不那么乏味,但在以前的版本中是可行的:

#include <compare>

struct minus_infinity_t {} constexpr minus_infinity;

auto constexpr operator<=> (minus_infinity_t, minus_infinity_t)
{ return std::weak_ordering::equivalent; }
template<class T> auto constexpr operator<=> (T, minus_infinity_t)
{ return std::weak_ordering::greater; }
template<class T> auto constexpr operator<=> (minus_infinity_t, T)
{ return std::weak_ordering::less; }


int main()
{
    constexpr int n = 0;
    constexpr long long k = 1;
    constexpr double l = 2;
    
    static_assert(n > minus_infinity);
    static_assert(k > minus_infinity);
    static_assert(l > minus_infinity);
    
    static_assert(minus_infinity <= n);
    static_assert(minus_infinity <= k);
    static_assert(minus_infinity <= l);
}

现场演示


改进思路:

  • 限制什么T可以与概念
  • 定义正无穷大
  • 定义负零和正零

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM