sizeof(short)=sizeof(int)实现的整数提升 背景 我正在研究C++中的整数提升规则,并遇到以下(取自):
4.5.1[pconv.prom] 如果sizeof(short)=sizeof(int)实现的整数提升 背景 我正在研究C++中的整数提升规则,并遇到以下(取自):,c++,language-lawyer,C++,Language Lawyer,4.5.1[pconv.prom] 如果int可以表示源类型的所有值,则除bool、char16\u t、char32\u t或wchar\u t以外的整数类型的PR值(其整数转换秩(4.13)小于int可以转换为int类型的PR值; 否则,可以将源prvalue转换为类型为的prvalue 无符号整数 4.13.1.3[conv.rank] long-long-int的等级应大于long-int的等级,后者应大于int的等级,后者 应大于short int的等级,该等级应大于 而不是有符号
int
可以表示源类型的所有值,则除bool
、char16\u t
、char32\u t
或wchar\u t
以外的整数类型的PR值(其整数转换秩(4.13)小于int
可以转换为int
类型的PR值;
否则,可以将源prvalue转换为类型为的prvalue
无符号整数
4.13.1.3[conv.rank]
的等级应大于long-long-int
的等级,后者应大于long-int
的等级,后者 应大于int
的等级,该等级应大于 而不是short int
有符号字符的秩
- 否则,应在两个操作数上执行积分提升(4.5)
short int
的大小和范围可能与int
的大小和范围相同,因此在这些情况下,似乎没有必要将short int
提升为int
。然而,上面没有提到这样一个例外
标准是否要求在这些情况下将short int
提升为int
(即使在生成的同一可执行文件中预先假定了实现优化)
附注/补充问题
我还注意到,措辞中使用了“可以是”而不是“应该是”,这是故意的吗?这是完全合法的,而且曾经非常普遍,因为
short
和int
具有相同的范围和表示;即使在今天,嵌入式系统对两者使用相同的16位表示也并不少见。C规范确实包含一些特定于此类实现的语言,因为在此类平台上,unsigned short
提升为unsigned int
,而在后者可以表示unsigned short
的所有值的平台上,它提升为signed int
。它并没有免除此类实现的规则要求将小于int
或unsigned int
的类型升级为其中一种类型,因为此类免除不会带来任何好处
该标准允许实现以其认为合适的任何方式执行计算,如果在所有情况下,
int
或unsigned int
的指定提升将产生定义的行为,则实现的计算产生相同的行为(假设规则)。如果类型为int
和short
的右值的行为无法区分,则这意味着如果实现选择在short
上执行计算,而不是在int
上执行计算。没有必要在标准中添加一条规则来豁免int
大小的short
类型的升级,因为“仿佛”规则已经足够了。是什么让你认为short int
可以具有与int
相同的大小和范围?@Javia1492标准定义了它so@Javia:因为它可以。e、 g.short int
要求至少为16位,在很长一段时间内,大多数环境将int
设置为16位类型。因此……@Javia1492:是什么让你认为它不能?正如其他人所提到的,除了一些系统将short
和int
都设置为16位之外,我还研究了两个都是64位的系统(克雷矢量系统)。这两种方法都是完全有效的。如果short
和int
大小相同,则促销成本为零。感谢,似乎部分解决了这一问题:)@OMGtechy:直到最近,几乎所有的编译器都遵守另一条似乎规则,但这条规则从未添加到标准中:如果整数的结果+
,-
,*
或按位运算符被强制转换或强制转换为小于int
的无符号整数类型,结果应与操作数被强制转换为该较小类型以及使用该类型执行的操作相同。在标准规定行为的所有情况下,它要求编译器的行为与规则规定的行为相同,但标准未定义某些情况语句x*=x
在int
为16位或至少33位的所有编译器上的行为相同,但在int
为32位的编译器上可能会否定时间定律和因果关系。我不认为允许int
为17到32位的平台与int
为任何其他大小的平台具有不同的行为有任何好处,但目前的标准免除了此类编译器遵守无符号类型应遵守模运算规则的原则。