为什么这个代码给出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
+^^^^^^^ ^^^^---- -------- -------- -------- -------- -------- --------
+
表示符号的位置;^
表示指数,-
表示尾数(即不带指数的值).
由于表示使用二进制指数和尾数,因此数字加倍会使指数递增1.您的程序精确地做了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()
.