c - 这是整数提升吗?它是如何工作的?

标签 c printf unsigned-char integer-promotion

我只是在尝试,尝试了两个 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 to int and then the computation is done on the int value.

关于c - 这是整数提升吗?它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34178147/

相关文章:

c - 在文件范围内声明矩阵,来自用户输入的维度? C

c - 在只有 3 个颜色分量的浮点像素上使用 SSE

c - 光线追踪器不会根据方向给出不同的光强度

c - 在 sprintf 中使用节点元素

c - 为什么打印 unsigned char 有时有效有时无效?在 C 中

c++ - 阻止进程使用 WMI 启动?

c - 打印字符串时出错

c++ - uint_fast16_t 的 sprintf 格式?

c - 从文件中读取换行符分隔的项目

C++ 从无符号字符数组创建 GUID