我有以下问题:例如我给了代码:
uint8_t a = 0x30;
uint16_t b = a << 8;
a
会先移位然后转换成uint16_t
吗?还是先转换成uint16_t
?还是这种行为依赖于编译器?我正在尝试构建一个 uint16_t
给定 lsb 和 msb 分别作为 uint8_t
s。
附言我不知道这种行为取决于它是 C 还是 C++,有人可以告诉它在这两种情况下如何工作吗?
最佳答案
C 中的表达式求值在表达式树中是自下而上的,在您的例子中就是 a << 8
在用作初始值设定项之前首先(显然)评估。 C 的类型系统遵循此评估,但见下文,因此 =
右侧的类型与左边的类型无关。类型本身通过隐式转换进行调整只是为了初始化。
也就是说,a << 8
的情况要复杂得多比他们第一眼看的要好,因为你为 a
选择了类型那是(很可能)窄类型。所以在大多数架构上uint8_t
因为它比 int
窄将被提升为任何算术表达式中的值。
所以在你的情况下,这会给你一个 int
, 因此左移 8
效果很好,然后是 int
转换为 uint16_t
.
您是否为 a
选择了一个常量?带 HO 钻头 1
,画面就不一样了。根据体系结构(如果 int
是 16 位),这可能会转移 1
。进入符号位,行为将是未定义的。
所有这些复杂的论点表明,用窄整数类型进行算术运算通常不是一个好主意。
关于c - C中什么时候发生类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46129316/