为什么这个代码给出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().

C++相关问答推荐

两个看似相同的代码的不同行为

Bison解析器转移/减少冲突

为什么信号量为空= 0,而不是阻塞?

GCC不警告隐式指针到整数转换'

为什么写入系统调用打印的字符数不正确?

丑陋的三重间接:可扩展的缓冲区管理 struct

如何设置指针指向在函数中初始化的复合文字中的整数?

手动矢量化性能差异较大

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

使用scanf在C中读取和存储文件中的值

实现简单字典时C语言中的段错误

Square不与Raylib一起移动

如何对现有的双向循环链表进行排序?

int * 指向int的哪个字节?

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

C编译和运行

struct 中的qsort,但排序后的 struct 很乱

const struct 成员的 typedef 中的灵活数组大小

C Makefile - 如何避免重复提及文件名

`void foo(int a[static 0]);` 有效吗?