我只是在尝试,尝试了两个 printf()。
unsigned char a = 1;
a = ~a;
printf("----> %x %x %x %x", ~a, a, ~a, ++a);
这个给出了输出
----> ffffff00 ff ffffff00 ff
下一个是
unsigned char a = 1;
printf("----> %x %x %x %x", ~a, a, ~a, ++a);
这个给出了输出
----> fffffffd 2 fffffffd 2
现在,我知道“++”和“~”的作用了。我还知道printf内部的操作顺序是从右开始的。
但是有人可以解释一下打印字节数的差异吗?对输出的完整解释当然会有所帮助,但我对字节数和两种情况下的差异更感兴趣[特别是在 printf a 和 ~a 部分]。
编辑:
好吧,看起来像++ 部分,我的错误“我也知道 printf 内部的操作顺序是从右边开始”已经提示了除了我希望寻找的答案之外的所有帖子。所以可能是我问的方式不对。
我会再试一次,
unsigned char a = ~1;
a = ~a;
printf("----> %x", a);
输出:----> 1
unsigned char a = ~1;
printf("----> %x", ~a);
输出:---->ffffff01
为什么会出现这种差异?
最佳答案
printf("----> %x %x %x %x", ~a, a, ~a,++a);
实际上会调用未定义的行为,因为你有一面对 a
和其他表达式的影响取决于相同的左值。因此任何事情都有可能发生,尝试解释产生的输出是没有希望的。
假设 2 的补码表示形式为 32 位整数,如果您这样写
printf("----> %x %x %x %x", ~a, a, ~a, a + 1);
你会得到不同的、不太令人惊讶的输出:
ffffff01 fe ffffff01 ff
让我解释一下发生了什么:
a = ~a;
a
包含 1
,被转换为具有相同值的 int
,~
运算符应用于1
计算为 -2
,将其转换回 unsigned char
得到 254 或 0xfe
。
printf
的参数计算如下:
<~a
:0xfe 转换为int
并且所有位都补码,产生0xffffff01
。a
转换为具有相同值的int
并打印为fe
。~a
当然再次给出相同的输出。a+1
:a
先转换为int
,然后加一,结果为255,打印为ff
。
The explanation for your surprising outputs is that
a
is first converted toint
and then the computation is done on theint
value.
关于c - 这是整数提升吗?它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34178147/