为什么这段代码会给出输出C++Sucks?它背后的概念是什么?
C++Sucks
#include <stdio.h> double m[] = {7709179928849219.0, 771}; int main() { m[1]--?m[0]*=2,main():printf((char*)m); }
在这里测试一下。
该数字7709179928849219.0具有以下 64 位二进制表示double:
7709179928849219.0
double
01000011 00111011 01100011 01110101 01010011 00101011 00101011 01000011 +^^^^^^^ ^^^^---- -------- -------- -------- -------- -------- --------
+显示标志的位置;^指数和-尾数(即没有指数的值)。
+
^
-
由于表示使用二进制指数和尾数,因此将数字加倍会使指数加一。您的程序精确地执行了 771 次,因此从 1075(的十进制表示10000110011)开始的指数最后变为 1075 + 771 = 1846;1846 的二进制表示是11100110110. 生成的模式如下所示:
10000110011
11100110110
01110011 01101011 01100011 01110101 01010011 00101011 00101011 01000011 -------- -------- -------- -------- -------- -------- -------- -------- 0x73 's' 0x6B 'k' 0x63 'c' 0x75 'u' 0x53 'S' 0x2B '+' 0x2B '+' 0x43 'C'
此模式对应于您看到打印的字符串,只是向后。同时,数组的第二个元素变为零,提供空终止符,使字符串适合传递给printf().
printf()