什么时候在C中发生类型转换

时间:2017-09-09 09:46:37

标签: c type-conversion integer-promotion

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

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

首先转移a然后转换为uint16_t?或者它会先转换为uint16_t吗?或者此行为编译器依赖?我试图将uint16_t给定的lsb和msb分别构建为uint8_t

P.S。我不知道这种行为取决于它的C或C ++,有人可以告诉它在两种情况下都会起作用吗?

1 个答案:

答案 0 :(得分:4)

C中的表达式求值在表达式树中是自下而上的,在您的情况下a << 8在用作初始化程序之前首先(显然)进行评估。 C&C的类型系统遵循此评估,但见下文,因此=右侧的类型与左侧的类型无关。只有初始化才能通过隐式转换调整类型本身。

也就是说,a << 8的内容比第一眼看上去要复杂得多,因为你选择的a类型(最有可能)是窄类型。因此,在大多数体系结构uint8_t上,因为它比int更窄,将被提升为任何算术表达式中的结构。

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

如果您选择HO位a的{​​{1}}常量,则图片会有所不同。根据体系结构(如果1为16位),这可能会将int移到符号位,并且行为将是未定义的。

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