如何编写unsigned short int literal?

moa*_*ala 37 c++ types

42作为unsigned int被明确定义为"42U".

unsigned int foo = 42U; // yeah!
Run Code Online (Sandbox Code Playgroud)

如何写"23"以便很明显它是一个无符号短整数?

unsigned short bar = 23; // booh! not clear!
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 35

你不能.数字文字不能包含shortunsigned short输入.

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

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

void (*f)(unsigned short) = &do_something;
f(23);
Run Code Online (Sandbox Code Playgroud)

......但我不建议.如果没有别的,这仅在unsigned short版本实际存在时才有效,而使用强制转换的调用执行通常的重载分辨率以找到最兼容的版本.


Ant*_*ert 10

unsigned short bar = (unsigned short) 23;
Run Code Online (Sandbox Code Playgroud)

或者说新话......

unsigned short bar = static_cast<unsigned short>(23);
Run Code Online (Sandbox Code Playgroud)

  • 不满意!也许我已经用最新的版本对其进行了修改,让你开心! (4认同)
  • 在C中这是正确的做法,但IIRC C风格的演员阵容在C++中是不受欢迎的. (2认同)

小智 6

至少在 Visual Studio(至少 2013 及更新版本)中,您可以编写

23ui16
Run Code Online (Sandbox Code Playgroud)

获取一个 unsigned short 类型的常量。

参见 stdint.h 中 INT8_MIN、INT8_MAX、INT16_MIN、INT16_MAX 等宏的定义

我目前不知道这是否是标准 C/C++ 的一部分