繁体   English   中英

printf("%c\\n",~('C'*-1)) 在c中是如何计算的?

[英]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

唯一重要的部分是这个表达式:

~('C' * -1)

让我们分解一下:

  • 'C'ASCII码 67。
  • ('C' * -1)是 -67。
  • -67 在二进制中是 10111101
  • 按位否定(使用~ ),您将得到 01000010,即 66。
  • 66 是 'B' 的 ASCII 码。

更一般地说,大多数计算机使用“二进制补码”算术,其中数字求反和按位求反等效于减 1。当然, B在 ASCII 中比C小 1。

在不使用二进制补码算法的计算机上,结果可能不同。 这样的电脑很少见。

众所周知,在二进制补码中“使数字为负”(将其乘以-1 )等效于反转其位表示( ~ )并加一( +1 )。 因此,上面的等价于~(~'C' + 1) ,如果原始数字(如这里的'C'的 ASCII 码)是奇数,则相当于一个简单的递减。

也就是说,如果设置了'C'的 LSB:

  • ~'C'的 LSB 未设置,这意味着
  • 添加一个 ( ~'C' + 1 ) 后,再次设置 LSB。
  • 现在反转整个表达式( ~(~'C' + 1) )将为我们提供原始数字 - 只是不再设置 LSB,因为它是在最终反转之前设置的(它像所有其他位一样反转 LSB)。

和上面一样让e简化

  • 'C'十进制为 67,二进制为 01000011
  • ('C'* -1 ) 在十进制中是 -67,在二进制中我们必须取 67 的恭维,并在它的恭维上加 1 = 10111100 +1 = 10111101
  • ~ ('C'*-1) 是 -67 的否定,即10111101 的补码是 01000010,十进制是 66,ascii 是 'B'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM