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

42作为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; } 

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

当然,为了分配给bar ,文字的值被隐式转换为unsigned short 。 在你的第一个示例代码中,你可以通过一个强制转换来显式地进行转换,但是我认为已经很明显,转换将会发生。 铸造可能更糟糕,因为使用一些编译器,它将平息任何警告,如果文字值超出了unsigned short的范围,将发出警告。 再说一次,如果你用这样的价值是有道理的,那么平息这些警告是很好的。

在编辑的例子中,碰巧是一个模板函数,而不是一个重载的函数,你可以select一个do_something<unsigned short>(23)do_something<unsigned short>(23) 。 有了一个重载的函数,你仍然可以避免使用下面的代码:

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

…但我不build议。 如果没有别的,只有在unsigned short版本实际存在的情况下才有效,而通过cast的调用执行通常的重载parsing来find可用的最兼容的版本。

 unsigned short bar = (unsigned short) 23; 

或在新的说话….

 unsigned short bar = static_cast<unsigned short>(23); 

没有unsigned short的修饰符。 整数默认具有inttypes,通常隐式转换为目标types,没有问题。 但是如果你真的想明确指出types,你可以写下面的内容:

 unsigned short bar = static_cast<unsigned short>(23); 

正如我所看到的,唯一的原因是使用这样的指示来正确推导模板types:

 func( static_cast<unsigned short>(23) ); 

但是对于这样的情况,更清楚的是如下所示:

 func<unsigned short>( 23 ); 

至less在Visual Studio(至less2013和更新),你可以写

 23ui16 

获得一个unsigned shorttypes的常量。

请参阅stdint.h中的INT8_MIN,INT8_MAX,INT16_MIN,INT16_MAX等macros的定义

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

不幸的是,为此定义的唯一方法是

单引号(')中的一个或两个字符,以字母L开头

根据http://cpp.comsci.us/etymology/literals.html

这意味着您必须将您的号码表示为ASCII转义序列:

 unsigned short bar = L'\x17'; 

不幸的是,他们不能。 但是,如果人们只看这个数字后面的两个单词,他们应该清楚地看到它是一个短暂的…这并不是那么模糊。 但是,这将是很好的。

如果将数量表示为4位hex数,则无符号短小可能更清晰。

unsigned short bar = 0x0017;

你可能不应该使用短,除非你有很多。 它的目的是使用比int更less的存储空间,但是int对于体系结构将具有“自然大小”。 从逻辑上来说,短暂的可能不会。 类似于位域,这意味着短裤可以被认为是空间/时间折衷。 如果它为你提供了大量的空间,这通常是值得的。 然而,在你的应用中,你不可能有很多文字,所以没有必要预见文字短。 用例根本不重叠。