在以下c程序中获得的输出的说明

时间:2013-07-27 09:23:30

标签: c

请告诉我们在程序结束时声明的主要内容是如何工作的,'\'use.Output s 0

#define P printf("%d\n", -1^~0);
#define M(P) int main()\
         {\
            P\
            return 0;\
         }
M(P)

4 个答案:

答案 0 :(得分:2)

宏扩展后,这相当于:

int main() { printf("%d\n", -1^~0); return 0; }

然后~0在{2}补码系统中为-1,因此-1 ^ ~0-1 ^ -10,因为自身编号为0

答案 1 :(得分:2)

使用gcc进行编译并添加-E选项(即在预处理和输出预处理代码后停止),揭示正在发生的事情:

# 1 "output.c"
# 1 "<command-line>"
# 1 "output.c"


int main() { printf("%d\n", -1^~0); return 0; }

基本上你只是打印一个整数:-1^~0

这相当于-1 XOR 0xFFFFFFFF(假设这里的整数是32位),因为1的两个补码(即-1的表示)是{{1始终输出0xFFFFFFFF0)。

答案 2 :(得分:1)

通过预处理器,您的代码将扩展为:

int main()
{
  printf("%d\n", -1^~0);
  return 0;
}

~00的1的补码,所有位都是1(在大多数实现中)。

  0000 0000 0000 0000 0000 0000 0000 0000 = 0
  1111 1111 1111 1111 1111 1111 1111 1111   <== ~0 , compliment each bit

假设您有32位int:

-11的2'c补码,所有位都是1:

  0000 0000 0000 0000 0000 0000 0000 0001   <== 1
  1111 1111 1111 1111 1111 1111 1111 1110   <== 1's complement of 1 
  1111 1111 1111 1111 1111 1111 1111 1111   <== 2's complement of 1 

所以-1^ ~0 输出: 0

因为^XOR - 运营商和1 xor 1 = 0

~0       ==   1111 1111 1111 1111 1111 1111 1111 1111   
-1       ==   1111 1111 1111 1111 1111 1111 1111 1111
            ------------------------------------------- Bitwise XOR
~0 ^ -1  ==   0000 0000 0000 0000 0000 0000 0000 0000

检查here how XOR works

答案 3 :(得分:0)

使用:

gcc -E <file_name>.c

  

-E 仅预处理;不编译,汇编或链接

输出:

int main() { printf("%d\n", -1^~0); return 0; }