我正在尝试为一些极端情况编写测试用例。对于type的输入,int64_t将不会编译以下行:
int64_t a = -9223372036854775808LL;
Run Code Online (Sandbox Code Playgroud)
错误/警告是:
error: integer constant is so large that it is unsigned [-Werror]
Run Code Online (Sandbox Code Playgroud)
我以为这个数字超出范围,所以我尝试了:
std::cout << std::numeric_limits<int64_t>::min() << std::endl;
Run Code Online (Sandbox Code Playgroud)
它输出完全相同的数字!!!因此常数在范围内。
如何解决此错误?
公平而简单:如何检查除整数之外的其他任何内容是否已在 C++ 中传递给我的类?
如果我通过 fe achar 'a'我的班级会得到编号97以 ascii 形式。
我试过了,std::numeric_limits但我不明白为什么它没有检测整数:
#include <iostream>
#include <limits>
class integerCheck
{
public:
integerCheck(int value)
{
if((value != std::numeric_limits<int>::is_integer))
return;
std::cout << value << std::endl;
}
};
int main()
{
integerCheck valInt(88);
integerCheck valChar('a');
integerCheck valFloat(13.44f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我发现这篇文章std::enable_if可以使用,但我无法想象即使在 c++20 中也无法检测到错误的输入,而是将所有内容都包装在模板中。
我错过了什么,我应该寻找/搜索什么来检测除整数值之外的任何东西? 预先感谢
当我运行此代码时:
#include <limits>
#include <cstdio>
#define T double
int main()
{
static const T val = std::numeric_limits<T>::min();
printf( "%g/2 = %g\n", val, val/2 );
}
Run Code Online (Sandbox Code Playgroud)
我希望看到一个不可预测的结果.但我得到了正确的答案:
(16:53) > clang++ test_division.cpp -o test_division
(16:54) > ./test_division
2.22507e-308/2 = 1.11254e-308
Run Code Online (Sandbox Code Playgroud)
这怎么可能?
我有一个任意的精度Integer类,它很像Java BigInteger或OpenSSL BIGNUM在运行.我无法理解我应该如何表达无限制的限制numeric_limit<Integer>::max().
Stack Overflow有几个问题,询问它是否可以执行(比如可以将std :: numeric_limits专门用于用户定义的类似数字的类吗?),以及一些使用基元的示例的答案,但我没有看到使用任意精度整数类的示例.我还访问了std :: numeric_limits参考页面,但我不清楚在这种情况下我应该做些什么.
在这一点上,我的内容是可以专注numeric_limit于我的Integer,并且可以将它放在标准命名空间中.我还需要专注于所有人numeric_limits.
如何指定无限制的限制numeric_limit<T>::max()?
以下是GCC 4.2.1 <limits>(OS X机器).
/// numeric_limits<int> specialization.
template<>
struct numeric_limits<int>
{
static const bool is_specialized = true;
static int min() throw()
{ return -__INT_MAX__ - 1; }
static int max() throw()
{ return __INT_MAX__; }
static const int digits = __glibcxx_digits (int);
static const int digits10 = __glibcxx_digits10 …Run Code Online (Sandbox Code Playgroud) 这可能是自行车脱落,但也许有一些有趣的东西让我失踪......
如果一个类初始化一个成员val,std::numeric_limits<double>::infinity()然后想要检查val是否已被更改为有效的东西(+/- inf在这里无效),这3种方法的权衡是什么,我是否错过任何其他有趣的方法来解决这个问题.(为了便于阅读,删除了const.)
bool IsInit() { return MinX != std::numeric_limits<double>::infinity(); } // a
bool IsInit() { return !std::isinf(MinX); } // b
bool IsInit() { return std::isfinite(MinX); } // c
Run Code Online (Sandbox Code Playgroud)
现在代码是C++ 03,但是如何使用C++ 11,C++ 14和C++ 17来改变选项.例如,使用C++ 17,这段代码可能就是这样std::optional<double> val.或者安静NaN是一个更安全的赌注,只是因为+/- inf在未来变得有效?
当我在阅读此代码的补丁时出现了这个问题:
为便于参考:
相关类型:
如何从"unsigned long int"的类型中知道变量的最大可赋值是多少?
我有一个静态const成员,并希望将其设置为最大整数.我正在尝试以下方法:
const static int MY_VALUE = std::numeric_limits<int>::max();
Run Code Online (Sandbox Code Playgroud)
但是得到以下错误:
错误:静态数据成员的类内初始化程序不是常量表达式
这有什么解决方案吗?函数如何不返回常量表达式?
编辑:添加-std = c ++ 11修复了该问题.我的室友告诉我,编译器(前C++ 11)不够聪明,不能确定std :: numeric_limits :: max()不会改变任何其他东西,因此不被认为是常量.这可能是造成这个错误的原因吗?
这段代码编译并运行
#include <limits>
#include <iostream>
struct Foo {
int x;
};
static_assert(!std::numeric_limits<Foo>::is_specialized);
int main() {
std::cout << "---" << std::endl;
std::cout << std::numeric_limits<Foo>::lowest().x << std::endl;
std::cout << std::numeric_limits<Foo>::min().x << std::endl;
std::cout << std::numeric_limits<Foo>::max().x << std::endl;
std::cout << "---" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它打印
---
0
0
0
---
Run Code Online (Sandbox Code Playgroud)
这些数字从哪里来?
在 cppreference 上我读到了
此信息是通过
std::numeric_limits模板的专业化提供的。标准库为所有算术类型提供了专业化
由此我推断,缺乏对给定类型的专门化Foo意味着我不允许将其用于Foo. 那么上面的输出只是UB的一种表现吗?或者是什么?
如果我在上面的代码中更改int为char,则输出为
---
---
Run Code Online (Sandbox Code Playgroud)
这对我来说是“什么?! s 去哪里了std::endl,首先???”
双方std::is_signed<T>并std::numeric_limits<T>::is_signed应该提供有关的符号性的答案T.
为什么现在有两个签名指标(即自C++ 11以来)?
如果您错误地执行以下操作:
#include<limits>
int arr[3];
auto x = std::numeric_limits<decltype(arr[0])>::max();
Run Code Online (Sandbox Code Playgroud)
您将从 STL 实现中的文件中获得无用的错误消息。
问题是模板参数是一个引用,所以修复是删除它:
auto x = std::numeric_limits<std::remove_reference_t<decltype(arr[0])>>::max();
Run Code Online (Sandbox Code Playgroud)
现在我的问题是为什么numeric_limits不知道自己做这个?我明白,你不想删除pointerness(因为max的char指针max的char是非常非常不同的东西),但我认为,只要你有一个参考作为参数传递给numeric_limits你非常乐意与被删除它得到的结果.