[英]C++ datatype s and their range
C++ 中是否存在具有范圍的數據類型
1 <= N <= 10 18
0 <= K <= 10 18
如果沒有,是否有限制變量輸入范圍?
由於 10 18 < 2 64 , unsigned long long
將足以容納您請求的范圍內的值。
關於“限制變量的輸入范圍”,尚不清楚您想到了什么樣的限制:
其中一些處理策略可以通過自定義 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.