簡體   English   中英

C++ 數據類型及其范圍

[英]C++ datatype s and their range

C++ 中是否存在具有范圍的數據類型

1 <= N <= 10 18
0 <= K <= 10 18

如果沒有,是否有限制變量輸入范圍?

由於 10 18 < 2 64unsigned long long 將足以容納您請求的范圍內的值。

關於“限制變量的輸入范圍”,尚不清楚您想到了什么樣的限制:

  • 您是否希望在范圍外聲明的值無法編譯的功能?
  • 您是否想要這樣的功能,即如果計算的值超出該范圍,則會發生某些特殊操作(例如使程序崩潰、拋出異常或打印錯誤消息)?
  • 或者您是否正在尋找一種將“超出范圍”值限制為范圍內最接近值的數據類型?
  • 或者您是否正在尋找一種類似於 C++ 的內置無符號數據類型的數據類型,其中上溢(和下溢)會導致表示值中出現模式“環繞”?

其中一些處理策略可以通過自定義 class 實現(以一定的效率為代價)。 如果您不需要對超出范圍的值進行任何特定的錯誤檢查,OTOH,那么普通的舊unsigned long long將可以正常工作並且效率最高,因為它直接映射到底層 CPU 硬件。

如果需要限制范圍,可以將變量包裝在 class 中。 您可以重載運算符,以便您可以像往常一樣對值進行算術運算。 通常我會求助於模板來實現這樣的功能,但我認為下面的例子更容易理解。

class MyInt
{
    public:
    MyInt(int minval, int maxval);

    MyInt& operator=(MyInt const& rhs);
    MyInt& operator=(int rhs);

    private:
    int _val;
    int _minval;
    int _maxval;

    bool _is_inrange(int val);
};

每當您對 class 執行操作時,它需要檢查結果是否在正確的范圍內。 當然,您基於 class 的數據類型需要能夠適應所需的值范圍。 我以int為例。 如果您使用模板,您可以在實例化 class 時將 select 設置為基本數據類型。

MyInt::MyInt(int minval, int maxval)
{
    _minval = minval;
    _maxval = maxval;
}

bool MyInt::_is_inrange(int val)
{
    return _minval <= val && val < _maxval;
}

您可以重載運算符以使用與處理原始數據類型相同的方式處理值。 我已經實現了賦值運算符作為示例,但您也可以重載算術運算符。

MyInt& MyInt::operator=(int rhs)
{
    if (_is_inrange(rhs))
    {
        _val = rhs;
    }
    else
    {
        // throw an error or do something else.
        cout << "Error: Invalid value" << endl;
    }
    return *this;
}

MyInt& MyInt::operator=(MyInt const& rhs)
{
    if (_is_inrange(rhs._val))
    {
        _val = rhs._val;
    }
    else
    {
        // throw an error or do something else.
        cout << "Error: Invalid value" << endl;
    }
    return *this;
}

最后,這是您將如何在程序中使用該 class 的方法。

int main()
{
    MyInt custom_int(0, 10);
    cout << "Assigning valid value..." << endl;
    custom_int = 9;

    cout << "Assigning invalid value..." << endl;
    custom_int = 10;

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM