答案 0 :(得分:5)
5u
不属于unsigned short
类型,但这并不意味着unsigned short test = 5u;
是"非法"。
通常会发生转换。由于某些unsigned int
的所有2^n
都是模n
,因此这只会截断右侧的值" bit wise"。只要rhs值适合短期,就什么都不会发生;如果没有,那么"低阶位"被采取。
我说的是" bit"在引号中,因为对于标准下的某些2^n
值,它实际上是数学模n
。这与位相同,但并不要求C ++环境使用明显的布局实际实现它。
答案 1 :(得分:4)
你误读了cppreference。它所说的(不是用这些话)是:
unsigned int
(或unsigned long int
或unsigned long long int
)请注意,它没有说任何关于'无效'等
在你的例子中
unsigned short test = 5u;
5u
文字 unsigned int
。
变量test
不 unsigned int
。这是一个unsigned short
。编译器插入一个隐式转换,这是完全合法的。
答案 2 :(得分:1)
关于首选项的表格是[lex.icon]
中的表6没有讨论O(1)
的原因是整数文字的最小类型可以是short
(来自后缀none部分)。由于int
保证与int
相同或大于int
,因此没有理由调出short
。
unsigned short test = 5u;
有效且会隐式将5u
转换为unsigned short
答案 3 :(得分:0)
cppreference还说:
整数文字的类型是值可以适合的第一种类型,从类型列表中取决于使用哪个数字基数和整数后缀。
这意味着5u
是unsigned int
,因为5属于该类型的范围。
如果值太大,例如9887766554433u
,如果该类型比unsigned long
宽,则它将是unsigned int
并且可以保存该值,否则类型将为{{ 1}}。
例如,如果您使用unsigned long long
声明变量,那么这很重要:
auto
此处const auto x = 9887766554433u;
的类型足以保存该值。