这里有多个答案,但都不是很令人满意。因此,以下是一个汇编答案,并附加一些信息以更全面地解释问题。
首先,避免使用shorts,但如果你发现自己需要它们,例如在使用索引网格数据时,切换到shorts以减小索引数据大小的两倍...那么请继续阅读...
1. 尽管在c或C++中无法表示无符号短文字面量,但你可以通过在字面量前加上'u'来轻松规避这个限制。
unsigned short myushort = 16u;
这段代码之所以有效,是因为它告诉编译器16是无符号整数,然后编译器寻找将其转换为无符号短整型的方法,找到了一个方法,大多数编译器会检查溢出情况,并且在不报错的情况下进行转换。当省略“u”时,“缩小转换”错误/警告表示代码正在抛弃符号,如果文字是负数(如-1),则结果是未定义的。通常这意味着你将得到一个非常大的无符号值,然后被截断以适应短整型。
2.有多种建议可以避开这个限制,大多数经验丰富的程序员会总结出一个“不要那样做”。
unsigned short myshort = (unsigned short)16;
unsigned short myothershort = static_cast<unsigned short>(16);
虽然这两种方法都能实现,但它们有两个主要问题。首先,它们冗长,程序员很懒,为了一个字面量而输入这么多内容容易被忽略,这会导致本可以通过更好的解决方案避免的基本错误。其次,它们不是免费的,特别是static_cast生成一些汇编代码来进行转换,虽然优化器可能(或可能不)能够发现它可以进行转换,但最好从一开始就编写高质量的代码。
unsigned short myshort = 16ui16;
这种解决方案是不可取的,因为它限制了能够阅读和理解你代码的人,并且意味着你正在踏上编译器特定代码的滑坡,这可能会导致你的代码突然失效,因为某些编译器作者的奇 whims 怪想法,或者某些公司随意地“右转”,或者离开而让你陷入困境。
unsigned short bar = L'\x17';
这篇文章太难懂了,没有人点赞。而且由于很多好的原因,应该避免使用难以理解的语言。
unsigned short bar = 0xf;
这段文字较难读懂。虽然能够读懂并转换十六进制是程序员必须学习的技能,但它很快变得难以阅读。现在问一下,这个数字是多少:0xbad? 现在将其转换为二进制…现在是八进制。
最后,如果您认为以上所有解决方案都不可行,我提供了另一种通过用户定义运算符可用的解决方案。
constexpr unsigned short operator ""_ushort(unsigned long long x)
{
return (unsigned short)x;
}
并且使用它
unsigned short x = 16_ushort;
不可否认,这也不是完美的。首先它需要一个unsigned long long,并将其全部转换为unsigned short,在此过程中抑制潜在的编译器警告,并使用c风格的转换。但它是constexpr的,保证在优化后的程序中是免费的,但在调试期间可以逐步执行。它也很简短,程序员更有可能使用它,而且表达力强,易于阅读和理解。不幸的是,它需要一个最近的编译器,因为C++的各个版本中可以合法地使用用户定义的运算符已经发生了变化。
所以选择你的权衡,但要小心,因为你可能会后悔。祝您编程愉快。