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

标签 c type-conversion integer-promotion

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

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

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

附言我不知道这种行为取决于它是 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/

相关文章:

c - printf() 中变量的提升和转换

c - 为什么 (int64_t)-1 + (uint32_t)0 有符号?

c - 向 libbluray 添加函数时 undefined reference

java - 如何在运行时知道 ResultSet 列类型兼容的 java 类型?

c - 精度考虑在 C 中如何工作?

vb.net 无法将 Dictionary(Of String, List(Of String)) 转换为对象

c - 查询结构的多维映射的设计,该结构的数据在 C 中的某些源代码文件中隐藏

c++ - 重新解释 c 中的强制转换

c - 确保 RichEdit 控件中的最后一个字符可见