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
你不能.数字文字不能包含short或unsigned 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)
小智 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++ 的一部分