printf行为和ASCII代码

时间:2017-05-28 19:41:28

标签: pointers printf ascii

我在面试问题中偶然发现了以下一段代码,我很好奇printf如何在这种情况下工作:

#include <stdio.h>
double m[]={10.711680659488273,580};    
int main() {    
m[1]--?m[0]*=2,main():printf((char*)m);
return 0;
}

问题是,您被要求更改数组中的初始值,以便printf函数打印您的全名。 我很好奇printf在这种情况下的表现。 感谢。

1 个答案:

答案 0 :(得分:0)

在C中,字符串由其地址表示。当您撰写"Hello"时,文字 Hello 将被放置在&#34;某处&#34;在内存中,但实际上你写的是"Hello",会出现一个地址(它是const char*)。因此,每当您将格式字符串传递给printf时,您始终会传递格式字符串的地址,即指针。在这里,printf得到一个指针,只是它从char*转换为double*(当你使用数组变量而没有索引到它时,你只需得到它的第一个元素的地址),但它是一个指针。文本本身来自10.711680659488273 * 2 ^ 580,并且空终止符来自0(结尾处的580剩余部分)。

例如,您可以在http://www.binaryconvert.com/convert_double.html检查该双精度的内部结构,并将生成的十六进制或二进制数复制到其他转换器中,例如https://paulschou.com/tools/xlate/(只记得在十六进制的情况下复制0x)。您已经可以看到结果的大部分(LeKhal),其余部分在执行乘法时出现。由于二进制浮点数由尾数和2的指数表示,因此将它们乘以2仅改变指数。由于您已经打开了转换页面,因此您可以跟踪指数中的位如何变化(这很容易,它只是步长1或580次),以及它如何影响结果的16位(认识到指数不在字节边界上开始。)