【发布时间】:2019-12-31 09:53:28
【问题描述】:
我正在尝试理解 C 中的隐式数据类型转换。我以为我已经理解了这个主题,但是下面的代码示例仍然让我感到困惑。
具体来说,我之前从 C 标准的草案中阅读了有关常用算术转换和整数提升的信息。
unsigned short int a = 0;
printf("\n%lld", (signed int)a - 1);
我正在使用 GCC 进行编译。
unsigned short int 是 2 个字节。
int 是 4 个字节。
当我运行这段代码时,我得到以下结果:4294967295
我期待结果 -1。
这是我预期会发生的:
Typecast 优先,
-的 LHS 变为signed int。-操作被执行。这里没有发生整数提升或隐式转换,因为 LHS 和 RHS 都已经是signed int。运算结果为 -1,数据类型为signed int。在
printf语句中,值-1 保留在转换为long long int的过程中,并显示-1 作为结果。
谁能解释一下我的逻辑缺陷在哪里?
【问题讨论】:
-
编译时使用
-Wall和-Wextra
标签: c type-conversion undefined-behavior implicit-conversion integer-promotion