类似于问题Bitshift and integer promotion?,在使用左位移位时,我有一个关于整数提升的问题。
unsigned int test(void)
{
unsigned char value8;
unsigned int result;
value8 = 0x12;
result = value8 << 8;
return result;
}在这种情况下,将是value8第一次提升到未加标记的int,还是特定于实现?
6.5.7位移位操作符.3符号。 整数提升在每个操作数上执行。结果的类型是提升的左操作数的类型。如果右操作数的值为负值,或大于或等于提升的左操作数的宽度,则行为未定义。
它说“整数提升是在每个操作数上执行的”,但是这里的提升规则是什么呢?
我想应该是convert to int if lesser rank than int,但我找不到。
我问这个问题,因为一个编译器(Renesas nc30wa)并没有提升到int,所以对于我的示例来说,结果总是0。
在这个平台上,一个字符宽8位,int 16位。
发布于 2012-06-26 08:07:28
短语“整型促销”是一种非常具体的东西,见于(for C99)节6.3.1.1 Booleans, characters, and integers
如果
int可以表示原始类型的所有值,则该值将转换为int;否则,该值将转换为unsigned int。这就是所谓的整数晋升。所有其他类型都不受整数提升的影响。
因此,假设您的unsigned char可以保存在int中,那么它将被提升为int。在那些unsigned char和int一样宽的罕见平台上,它将推广到unsigned int。
在C11中,这种情况只略有改变:
如果
int可以表示原始类型的所有值(受宽度限制,用于位字段),则将该值转换为int;否则,该值将转换为unsigned int。这就是所谓的整数晋升。所有其他类型都不受整数提升的影响。
如果一个特定的编译器没有遵循这种行为,那么它实际上是不符合的。但是,考虑到您列出的编译器是用于嵌入式系统的,这并不令人惊讶。
许多是为特定目的而构建的,而一致性并不总是列在需求列表的首位。可能会有编译器标志,使其更符合标准。
看看您的特定环境,M16C Series,R8C Family C Compiler Package V.5.45 C Compiler在2.1.4 nc30 Command Line Options一节中包含了f. Generated code modification options小节。
-fextend_to_int**,**-fETI**:**在将char-type数据扩展到int类型后执行操作。按照ANSI标准扩展。
虽然我怀疑-fansi可能是一个更好的选择,因为它还涵盖了其他一些事情。
发布于 2012-06-26 08:06:19
value8被提升为int,假设unsigned char的转换级别低于int的转换级别(通常在大多数平台上都是如此)。
整数的转换等级在6.3.1.1中用C99描述。
注意,默认情况下,某些编译器禁用整数提升规则。例如,MicroChip编译器MPLAB C18。在编译器的文档中查找ISO一致性。
https://stackoverflow.com/questions/11203015
复制相似问题