问题

为什么这段代码给出输出C++Sucks?它背后的概念是什么?

 #include <stdio.h>

double m[] = {7709179928849219.0, 771};

int main() {
    m[1]--?m[0]*=2,main():printf((char*)m);    
}
 

测试它here .

  最佳答案

数字7709179928849219.0具有以下二进制表示为64位double:

 01000011 00111011 01100011 01110101 01010011 00101011 00101011 01000011
+^^^^^^^ ^^^^---- -------- -------- -------- -------- -------- --------
 

+显示符号的位置; ^ 指数; - 指数(即没有指数的值)。

由于表示使用二进制指数和mantissa,将数量增加一倍,指数增加一倍.您的程序确切地做了771次,所以从1075开始的指数(10000110011的小数表示)在最后变为1075 + 771 = 1846;1846的二进制表示是11100110110.由此产生的模式如下所示:

 01110011 01101011 01100011 01110101 01010011 00101011 00101011 01000011
-------- -------- -------- -------- -------- -------- -------- --------
0x73 's' 0x6B 'k' 0x63 'c' 0x75 'u' 0x53 'S' 0x2B '+' 0x2B '+' 0x43 'C'
 

这个模式对应于您看到的字符串,只是向后.同时,数组的第二个元素变为零,提供空终止器,使字符串适合传递给printf().

  相同标签的其他问题

cdeobfuscation