c ++中的signed或unsigned int

时间:2014-07-18 12:26:01

标签: c++ std unsigned signed

我如何检查给定的int(或任何其他数据类型)是签名还是未签名? 我在搜索时发现了这个功能,

std::numeric_limits<int>::is_signed

但我只能输入数据类型,有没有办法可以通过变量名检查,比如。

signed int x = 5;

现在我想创建一个函数来检查x是否为带符号的int。

如果你们能回答这些小问题,那将非常感激。

  1. 为什么我们使用&#39; ::&#39;这些运营商在std之后?
  2. 当我们在std :: cout中使用它们时它们是什么意思,它是一样的吗?
  3. 此处为numeric_limits&lt;&gt;是一个班级还是什么?
  4. 同样,我们为什么要使用这些&#39; ::&#39;在is_signed之前?

2 个答案:

答案 0 :(得分:2)

  

有没有办法可以通过变量名来检查

从C ++ 11开始,我们有decltype来获取变量或表达式的类型:

std::numeric_limits<decltype(x)>::is_signed

从历史上看,它比较棘手;从变量推断类型的唯一方法是通过模板参数推导:

template <typename T>
bool is_signed(T const &) {
    return std::numeric_limits<T>::is_signed;
}
  

为什么我们在std后使用'::'这些运算符?

这是范围解析运算符,表示我们希望在命名空间numeric_limits中查找名称std

  

当我们在std::cout中使用它们时它们是什么意思,是否相同?

是。与标准库中的大多数名称一样,cout也位于namespace std内。

  

这里numeric_limits<>是一个类还是什么?

它是一个类模板,包含各种静态变量和函数,用于描述用作模板参数的类型。以下是参考:http://en.cppreference.com/w/cpp/types/numeric_limits

  

同样,为什么我们在is_signed之前使用这些'::'?

再一次,通过说我们希望在is_signed的类范围内查找名称std::numeric_limits<int>来解决范围。

答案 1 :(得分:1)

像这样:

constexpr bool is_signed = std::numeric_limits<decltype(x)>::is_signed();

如果numeric_limits的{​​{1}}类型没有专门化,则无法编译。更通用的解决方案是来自x标题的is_signed

<type_traits>

是的,constexpr bool is_signed = std::is_signed<decltype(x)>::value; numeric_limits都是类模板。