为什么这段代码给出输出C++Sucks
?它背后的概念是什么?
#include <stdio.h>
double m[] = {7709179928849219.0, 771};
int main() {
m[1]--?m[0]*=2,main():printf((char*)m);
}
测试它here .
为什么这段代码给出输出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()
.