c++ - 小于最小可表示 int 的最小 int 值?

标签 c++ integer comparison minimum

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

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

我知道我可以像 -std::numeric_limits<double>::infinity() ,但如果我要将 int 变量与该值进行比较,比较将以 FP 精度进行,并且我担心其对性能的影响。理想情况下,我希望所有的比较都用整数完成。

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

最佳答案

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

使用 C++20's three way comparator (aka spaceship) 就不那么乏味了,但在以前的版本中可行:

#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);
}

Live demo


改进思路:

  • 限制概念中的T
  • 定义正无穷
  • 定义负零和正零

关于c++ - 小于最小可表示 int 的最小 int 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71699137/

相关文章:

rust - 泛化添加无符号和有符号整数类型

java - 在 java 中用 int 排列 ArrayList<String>

string - Neo4j - 将节点属性集从字符串转换为整数

c++ - 将一个对象的函数设置为由arduino库中的另一个对象调用

c++ - 将参数传递给函数指针

mysql - 使用空间 MySQL 功能加速文本比较(特征向量)

php - 过滤数组以保留元素数最少且第一个和最后一个元素唯一的行

comparison - Vaadin vs Apache 点击我的 webapp 开发选择哪一个

c++ - 内联命名空间和不明确的声明

C++ 使用模板时没有匹配的调用函数,链接器错误