为什么不应该使用整数文字?

时间:2016-01-21 17:55:20

标签: c++ c++11 types language-lawyer literals

根据cppreference
以下语句将是无效的C ++:

unsigned short test = 5u;

enter image description here

为什么在无符号短裤上不允许使用后缀uU? 代码仍然编译,但这样做有什么后果吗?

4 个答案:

答案 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。它所说的(不是用这些话)是:

  • 以U结尾的字面值为unsigned int(或unsigned long intunsigned long long int

请注意,它没有说任何关于'无效'等

在你的例子中

unsigned short test = 5u;

5u文字 unsigned int

变量test unsigned int。这是一个unsigned short。编译器插入一个隐式转换,这是完全合法的。

答案 2 :(得分:1)

关于首选项的表格是[lex.icon]

中的表6

enter image description here

没有讨论O(1)的原因是整数文字的最小类型可以是short(来自后缀none部分)。由于int保证与int相同或大于int,因此没有理由调出short

unsigned short test = 5u;

有效且会隐式将5u转换为unsigned short

答案 3 :(得分:0)

cppreference还说:

  

整数文字的类型是值可以适合的第一种类型,从类型列表中取决于使用哪个数字基数和整数后缀

这意味着5uunsigned int,因为5属于该类型的范围。

如果值太大,例如9887766554433u,如果该类型比unsigned long宽,则它将是unsigned int并且可以保存该值,否则类型将为{{ 1}}。

例如,如果您使用unsigned long long声明变量,那么这很重要:

auto

此处const auto x = 9887766554433u; 的类型足以保存该值。