有关常规算术转换的问题-GCC编译器

tha*_*ude 2 c type-conversion undefined-behavior integer-promotion implicit-conversion

我试图理解C中的隐式数据类型转换。我以为我已经理解了这个主题,但是下面的代码示例仍然让我感到困惑。

具体来说,我以前从C标准的草稿中了解了常用的算术转换和整数提升。

    unsigned short int a = 0;
    printf("\n%lld", (signed int)a - 1);
Run Code Online (Sandbox Code Playgroud)

我正在使用GCC进行编译。

unsigned short int是2个字节。 int是4个字节。

运行此代码时,将得到以下结果:4294967295

我期望结果为-1

这是我期望发生的事情:

  1. Typecast优先,的LHS -变为signed int

  2. -操作已执行。由于LHS和RHS都已经存在,因此这里没有整数提升或隐式转换signed int。运算结果为-1,数据类型为signed int

  3. printf语句内,值-1保留在到的转换中long long int,并且-1显示为结果。

有人可以解释我的逻辑缺陷在哪里吗?

Bat*_*eba 6

由于是不适用于某种类型的格式说明符,因此未定义行为%lldint

是的,确实(signed int)a - 1int带有value 的类型-1,但是printf调用是未定义的部分。C标准中没有任何内容暗示要进行转换long long

  • 哇谢谢你 !是的,如果我将`(signed int)a-1`转换为`signed long long int`,那么我会得到预期的结果。 (2认同)