10

类似于问题Bitshift and integer Promotion?,我有一个关于使用左移位时整数提升的问题。

unsigned int test(void)
{
  unsigned char value8;
  unsigned int result;

  value8 = 0x12;
  result = value8 << 8;
  return result;
}

在这种情况下, value8 将首先提升为 unsiged int 还是特定于实现?

6.5.7 位移位运算符... 3 Sematics ...
整数提升在每个操作数上执行。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

它说“对每个操作数执行整数提升”。,但是这里的推广规则是什么?

我认为它应该是convert to int if lesser rank than int,但我找不到它。

我问这个,因为一个编译器(Renesas nc30wa)没有升级为 int,所以我的样本的结果总是 0。

在这个平台上,char 为 8 位宽,int 为 16 位。

4

2 回答 2

16

短语“整数促销”是一个非常具体的东西,可以在(对于 C99)部分找到6.3.1.1 Booleans, characters, and integers

如果 anint可以表示原始类型的所有值,则将该值转换为int; 否则,将其转换为unsigned int. 这些被称为整数促销。整数提升不会改变所有其他类型。

因此,假设您unsigned char可以在 中举行int,它将被提升为int。在那些稀有unsigned char的和a一样宽的平台上int,它会升级为a unsigned int

这在 C11 中仅略有改变:

如果 anint可以表示原始类型的所有值(受宽度限制,对于位域),则该值将转换为int; 否则,将其转换为unsigned int. 这些被称为整数促销。整数提升不会改变所有其他类型。

如果一个特定的编译器不遵循这种行为,那么它就不是真正的符合。但是,鉴于您列出的编译器是针对嵌入式系统的,这并不奇怪。

许多是为特定目的而构建的,并且一致性在要求列表中并不总是很高。可能有编译器标志可以使其更符合标准。


查看您的特定环境,M16C Series,R8C Family C Compiler Package V.5.45 C Compiler在 section 2.1.4 nc30 Command Line Options, subsection中有f. Generated code modification options

-fextend_to_int, -fETI:char将-type 数据扩展为该类型后执行操作int。根据 ANSI 标准进行扩展。

尽管我怀疑-fansi可能是一个更好的选择,因为它还涵盖了其他一些内容。

于 2012-06-26T08:07:28.880 回答
3

value8被提升为int,假设 的转换排名unsigned char低于 的转换排名int(通常在大多数平台上都是这种情况)。

整数的转换等级在 C99 的 6.3.1.1 中描述。

请注意,某些编译器默认禁用整数提升规则。例如,MicroChip 编译器 MPLAB C18。在编译器的文档中查找 ISO 一致性。

于 2012-06-26T08:06:19.400 回答