如何写一个无符号的短整型文字?

新手上路,请多包涵

42 as unsigned int 很好地定义为“42U”。

 unsigned int foo = 42U; // yeah!

我怎样才能写出“23”,以便清楚它是一个无符号短整数?

 unsigned short bar = 23; // booh! not clear!


编辑,以便问题的含义更清楚:

 template <class T>
void doSomething(T) {
    std::cout << "unknown type" << std::endl;
}

template<>
void doSomething(unsigned int) {
    std::cout << "unsigned int" << std::endl;
}

template<>
void doSomething(unsigned short) {
    std::cout << "unsigned short" << std::endl;
}

int main(int argc, char* argv[])
{
    doSomething(42U);
    doSomething((unsigned short)23); // no other option than a cast?

    return EXIT_SUCCESS;
}

原文由 moala 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 647
2 个回答

你不能。数字文字不能有 shortunsigned short 类型。

当然为了赋值给 bar ,文字的值被隐式转换为 unsigned short 。在您的第一个示例代码中,您 可以 使用强制转换显式地进行转换,但我认为很明显会发生什么转换。强制转换可能会更糟,因为对于某些编译器,如果文字值超出 unsigned short 的范围,它将消除任何可能发出的警告。再说一次,如果你 使用这样的值是有充分理由的,那么平息警告是好的。

在您编辑的示例中,它恰好是模板函数而不是重载函数,您确实可以替代强制转换: do_something<unsigned short>(23) 。使用重载函数,您仍然可以避免强制转换:

 void (*f)(unsigned short) = &do_something;
f(23);

…但我不建议这样做。如果没有别的,这仅在 unsigned short 版本确实存在时才有效,而使用强制转换的调用执行通常的重载解决方案以找到最兼容的可用版本。

原文由 Steve Jessop 发布,翻译遵循 CC BY-SA 2.5 许可协议

在 C++11 及更高版本中,如果您真的想要一个无符号短文字转换,那么可以使用用户定义的文字来完成:

 using uint16 = unsigned short;
using uint64 = unsigned long long;

constexpr uint16 operator""_u16(uint64 to_short) {
    // use your favorite value validation
    assert(to_short < USHRT_MAX); // USHRT_MAX from limits.h
    return static_cast<uint16>(to_short);
}

int main(void) {
  uint16 val = 26_u16;
}

原文由 pmw1234 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏