printf(";%c\n";,~(&x27;c&&x27;*-1))是如何在c中计算的? #包括 int main() { printf(“%c\n”,约('c'*-1)); 返回0; }
我已经尝试了上面的源代码,执行时没有任何警告 输出为B。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
我很兴奋上面的代码是如何处理的,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;
}
让我们把它分解一下:
是代码67'C'
是-67('C'*-1)
- -67是二进制的10111101
- 按位求反(使用
),得到01000010,即66~
- 66是“B”的ASCII码
B
比ASCII中的C
小一个
在一台不使用二的补码运算的计算机上,结果可能不同。这种计算机很少见。众所周知,在二的补码中“使一个数字为负数”(将它乘以-1
)相当于将它的位表示法(~
)倒置并加一(+1
)。因此,上面的数字相当于~(~'C'+1)
,如果原始数字(如这里的'C'
的ASCII码)是奇数,那么它又相当于一个简单的减量
也就是说,如果设置了'C'
的LSB:
- 未设置
的LSB,这意味着~'C'
- 添加一个(
)后,再次设置LSB李>~'C'+1
- 现在反转整个表达式(
)将为我们提供原始数字-只是不再设置LSB,因为它是在最终反转之前设置的(与其他位一样反转LSB)~(~'C'+1)
- 'C'十进制为67,二进制为01000011
- ('C'*-1)十进制为-67,二进制为67 并在其赞美词中加上1=10111100+1=10111101
- ~('C'*-1)是-67的否定,即10111101的赞美是 01000010在ascii中十进制是66,它是“B”
~('C' * -1)