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_t
s.
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
移到符号位并且行为将是不确定的。
所有这些复杂的论点表明,用窄整数类型进行算术运算通常不是一个好主意。
我有以下问题:例如我给了代码:
uint8_t a = 0x30;
uint16_t b = a << 8;
a
会先移位再转换成uint16_t
吗?还是先转成uint16_t
?还是这种行为依赖于编译器?我正在尝试构建一个 uint16_t
给定的 lsb 和 msb 分别作为 uint8_t
s.
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
移到符号位并且行为将是不确定的。
所有这些复杂的论点表明,用窄整数类型进行算术运算通常不是一个好主意。