[英]How printf(“%c\n”,~('C'*-1)) is computed in c?
#include<stdio.h>
int main()
{
printf("%c\n",~('C'*-1));
return 0;
}
我已经尝试了上述源代码并在没有任何警告的情况下执行。
输出为B 。 我很兴奋上面的代码是如何处理的以及 printf("%c\\n",~('C'*-1))
在 C 中, 'C'
是一个int
,它是一个值为67
的小整数(假设是 ASCII)。 您可以从以下位置获取每一步:
#include<stdio.h>
int main()
{
printf("%d\n", 'C'); //67
printf("%d\n", 'C' * -1); //-67
printf("%d\n", ~('C' * - 1)); //66
printf("%c\n",~('C' * -1)); //B
return 0;
}
在 2 的补码中, ~(-67)
值为66
。
众所周知,在二进制补码中“使数字为负”(将其乘以-1
)等效于反转其位表示( ~
)并加一( +1
)。 因此,上面的等价于~(~'C' + 1)
,如果原始数字(如这里的'C'
的 ASCII 码)是奇数,则相当于一个简单的递减。
也就是说,如果设置了'C'
的 LSB:
~'C'
的 LSB 未设置,这意味着~'C' + 1
) 后,再次设置 LSB。~(~'C' + 1)
)将为我们提供原始数字 - 只是不再设置 LSB,因为它是在最终反转之前设置的(它像所有其他位一样反转 LSB)。和上面一样让e简化
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.