printf(";%c\n";,~(&x27;c&&x27;*-1))是如何在c中计算的? #包括 int main() { printf(“%c\n”,约('c'*-1)); 返回0; }

printf(";%c\n";,~(&x27;c&&x27;*-1))是如何在c中计算的? #包括 int main() { printf(“%c\n”,约('c'*-1)); 返回0; },c,C,我已经尝试了上面的源代码,执行时没有任何警告 输出为B。 我很兴奋上面的代码是如何处理的,printf(“%c\n”、~(c'*-1))的含义是什么,在c中,'c'是一个int,是一个值为67的小整数(假设为ASCII)。您可以从以下位置获得每个步骤: #include<stdio.h> int main() { printf("%c\n",~('C'*-1)); return 0; } #包括 int main() { printf(“%d\n”,“C”);//67 printf

我已经尝试了上面的源代码,执行时没有任何警告

输出为B
我很兴奋上面的代码是如何处理的,printf(“%c\n”、~(c'*-1))的含义是什么,在c中,
'c'
是一个
int
,是一个值为
67
的小整数(假设为ASCII)。您可以从以下位置获得每个步骤:

#include<stdio.h>
int main()
{
printf("%c\n",~('C'*-1));
return 0;
}
#包括
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
返回0;
}

在2的补码中,
~-67
的值是
66
唯一重要的部分是这个表达式:

#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;
}
让我们把它分解一下:

  • 'C'
    是代码67
  • ('C'*-1)
    是-67
  • -67是二进制的10111101
  • 按位求反(使用
    ~
    ),得到01000010,即66
  • 66是“B”的ASCII码
更一般地说,大多数计算机使用“”算法,其中数字求反后按位求反相当于减去1。当然
B
比ASCII中的
C
小一个

在一台不使用二的补码运算的计算机上,结果可能不同。这种计算机很少见。

众所周知,在二的补码中“使一个数字为负数”(将它乘以
-1
)相当于将它的位表示法(
~
)倒置并加一(
+1
)。因此,上面的数字相当于
~(~'C'+1)
,如果原始数字(如这里的
'C'
的ASCII码)是奇数,那么它又相当于一个简单的减量

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

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

同上,让我们简化一下

  • 'C'十进制为67,二进制为01000011
  • ('C'*-1)十进制为-67,二进制为67 并在其赞美词中加上1=10111100+1=10111101
  • ~('C'*-1)是-67的否定,即10111101的赞美是 01000010在ascii中十进制是66,它是“B”

很酷。二的补码和一的补码。这很快就不会通过代码审查。这取决于审查者和他们的心态。在二的补码处理器上。“-67是二进制的,10111101”至少有16位。
~('C' * -1)