【问题标题】:When does type conversion happen in C什么时候在 C 中发生类型转换
【发布时间】:2018-02-18 03:18:39
【问题描述】:

我有以下问题:例如我给了代码:

uint8_t a = 0x30;
uint16_t b = a << 8;

a 会先移位然后转换为 uint16_t 吗?还是先转换成uint16_t?还是这种行为编译器依赖?我正在尝试构建一个 uint16_t 给定 lsb 和 msb 分别为 uint8_ts。

附:我不知道这种行为取决于它是 C 还是 C++,有人可以告诉它在这两种情况下如何工作吗?

【问题讨论】:

  • C != C++。首先确定您实际使用的语言,并用 only 标记该语言。
  • C 还是 C++?它们是两种截然不同的语言,尤其是在语义方面。
  • 这种行为是否取决于它是c还是c++
  • 可能。即使没有,选择一种语言也会更容易找到重复或参考链接。
  • 现在当你选择一种语言时,我推荐你read about implicit conversions in C,尤其是关于integer promotions的部分。

标签: c type-conversion integer-promotion


【解决方案1】:

C 中的表达式评估在表达式树中自下而上,即在您的情况下,a &lt;&lt; 8 在用作初始化程序之前首先(显然)被评估。 C的类型系统遵循这个评估,但见下文,所以=右边的类型与左边​​的类型无关。只有在初始化时,类型本身才通过隐式转换进行调整。

也就是说,a &lt;&lt; 8 的情况比乍看之下要复杂得多,因为您为a 选择了一个(很可能)窄类型的类型。因此,在大多数架构上,uint8_t 比 int 窄,在任何算术表达式中都会被提升为。

所以在你的情况下,这会给你一个int,因此8 的左移效果很好,然后int 被转换为uint16_t。

如果您为 a 选择了一个带有 HO 位 1 的常量,情况会有所不同。根据架构(如果 int 是 16 位),这可能会将 1 转换为符号位,并且行为将是未定义的。

所有这些复杂的论点都表明,用窄整数类型进行算术通常不是一个好主意。

【讨论】:

  • 所以在操作数比 int 窄的任何算术运算中,在执行操作之前将其提升为 int?
  • 如果 int 是 16 位而 a 是 0xF0 会发生什么?什么时候会出错?
  • 左移会将 1 移入符号位,这是不允许的。
猜你喜欢
  • 1970-01-01
  • 2012-03-17
  • 2018-08-27
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2019-03-01
  • 2013-07-18
  • 2012-10-01
相关资源
最近更新 更多