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

When does type conversion happen in C

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

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

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

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

C 中的表达式求值在表达式树中是自下而上的,也就是说,在您的情况下,a << 8 在用作初始值设定项之前首先(显然)求值。 C 的类型系统遵循此评估,但见下文,因此 = 右侧的类型与左侧的类型无关。类型本身用隐式转换调整只是为了初始化。

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

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

如果您为 a 和 HO 位 1 选择了一个常量,情况就会不同。根据体系结构(如果 int 是 16 位),这可能会将 1 移到符号位并且行为将是不确定的。

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