请告诉我们在程序结束时声明的主要内容是如何工作的,'\'use.Output s 0
#define P printf("%d\n", -1^~0);
#define M(P) int main()\
{\
P\
return 0;\
}
M(P)
答案 0 :(得分:2)
宏扩展后,这相当于:
int main() { printf("%d\n", -1^~0); return 0; }
然后~0
在{2}补码系统中为-1
,因此-1 ^ ~0
为-1 ^ -1
为0
,因为自身编号为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始终输出0xFFFFFFFF
(0
)。
答案 2 :(得分:1)
通过预处理器,您的代码将扩展为:
int main()
{
printf("%d\n", -1^~0);
return 0;
}
~0
是0
的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:
-1
是1
的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
答案 3 :(得分:0)
使用:
gcc -E <file_name>.c
-E 仅预处理;不编译,汇编或链接
输出:
int main() { printf("%d\n", -1^~0); return 0; }