如何写一个无符号的短整型文字?
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; }
你不能。 数字文字不能有short
或unsigned 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的修饰符。 整数默认具有int
types,通常隐式转换为目标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对于体系结构将具有“自然大小”。 从逻辑上来说,短暂的可能不会。 类似于位域,这意味着短裤可以被认为是空间/时间折衷。 如果它为你提供了大量的空间,这通常是值得的。 然而,在你的应用中,你不可能有很多文字,所以没有必要预见文字短。 用例根本不重叠。