我有以下问题:例如我给了代码:
uint8_t a = 0x30;
uint16_t b = a << 8;
首先转移a
然后转换为uint16_t
?或者它会先转换为uint16_t
吗?或者此行为编译器依赖?我试图将uint16_t
给定的lsb和msb分别构建为uint8_t
。
P.S。我不知道这种行为取决于它的C或C ++,有人可以告诉它在两种情况下都会起作用吗?
答案 0 :(得分:4)
C中的表达式求值在表达式树中是自下而上的,在您的情况下a << 8
在用作初始化程序之前首先(显然)进行评估。 C&C的类型系统遵循此评估,但见下文,因此=
右侧的类型与左侧的类型无关。只有初始化才能通过隐式转换调整类型本身。
也就是说,a << 8
的内容比第一眼看上去要复杂得多,因为你选择的a
类型(最有可能)是窄类型{ EM>。因此,在大多数体系结构uint8_t
上,因为它比int
更窄,将被提升为任何算术表达式中的结构。
所以在你的情况下会给你一个int
,因此左移8
效果很好,然后int
转换为uint16_t
。< / p>
如果您选择HO位a
的{{1}}常量,则图片会有所不同。根据体系结构(如果1
为16位),这可能会将int
移到符号位,并且行为将是未定义的。
所有这些复杂的论证表明,使用窄整数类型进行算术通常不是一个好主意。