小编典典

这四行棘手的 C 代码背后的概念

all

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

#include <stdio.h>

double m[] = {7709179928849219.0, 771};

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

在这里测试一下。


阅读 106

收藏
2022-03-24

共1个答案

小编典典

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

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

+显示标志的位置;^指数和-尾数(即没有指数的值)。

由于表示使用二进制指数和尾数,因此将数字加倍会使指数加一。您的程序精确地执行了 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().

2022-03-24