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。
这是我期望发生的事情:
Typecast优先,的LHS -变为signed int。
-操作已执行。由于LHS和RHS都已经存在,因此这里没有整数提升或隐式转换signed int。运算结果为-1,数据类型为signed int。
在printf语句内,值-1保留在到的转换中long long int,并且-1显示为结果。
有人可以解释我的逻辑缺陷在哪里吗?
由于是不适用于某种类型的格式说明符,因此未定义行为。%lldint
是的,确实(signed int)a - 1是int带有value 的类型-1,但是printf调用是未定义的部分。C标准中没有任何内容暗示要进行转换long long。