什么是数据(数字),如果以下语句中的所需输出是:令人惊讶?
main() { int data; if(data!=0 && data==-data) { printf("AMAZING"); } }
解决方法
它必须是整数的最小值,即如果它是32位则为0x80000000,因为这是除了零之外唯一的数字,在否定时保持不变.
#include <stdio.h> main() { int data = 0x80000000; if(data!=0 && data==-data) { printf("AMAZING"); } }
结果:
AMAZING
正如理查德彭宁顿正确指出的那样,这是有效的,因为two’s complement表示负数.最大可表示正数的绝对值小于最大负数,因此如果您尝试否定最大负数,则溢出int并回绕,返回相同的数字.
对于使用one’s complement的计算机,每个可表示数字的负值也可以在没有溢出的情况下表示,因此这个难题没有解决方案.