首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用运算符<<进行整数提升

使用运算符<<进行整数提升
EN

Stack Overflow用户
提问于 2012-06-26 07:58:10
回答 2查看 5.1K关注 0票数 11

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

代码语言:javascript
复制
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位。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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 charint一样宽的罕见平台上,它将推广到unsigned int

在C11中,这种情况只略有改变:

如果int可以表示原始类型的所有值(受宽度限制,用于位字段),则将该值转换为int;否则,该值将转换为unsigned int。这就是所谓的整数晋升。所有其他类型都不受整数提升的影响。

如果一个特定的编译器没有遵循这种行为,那么它实际上是不符合的。但是,考虑到您列出的编译器是用于嵌入式系统的,这并不令人惊讶。

许多是为特定目的而构建的,而一致性并不总是列在需求列表的首位。可能会有编译器标志,使其更符合标准。

看看您的特定环境,M16C Series,R8C Family C Compiler Package V.5.45 C Compiler2.1.4 nc30 Command Line Options一节中包含了f. Generated code modification options小节。

-fextend_to_int**,** -fETI**:**在将char-type数据扩展到int类型后执行操作。按照ANSI标准扩展。

虽然我怀疑-fansi可能是一个更好的选择,因为它还涵盖了其他一些事情。

票数 17
EN

Stack Overflow用户

发布于 2012-06-26 08:06:19

value8被提升为int,假设unsigned char的转换级别低于int的转换级别(通常在大多数平台上都是如此)。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11203015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档