2017-05-28 67 views
1

我偶然在一个面试问题下面这段代码,和我很好奇在这样的情况怎么printf的作品:printf的行为和ASCII码

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

的问题是,你问更改数组中的初始值,以便printf函数输出您的全名。 我很好奇printf在这种情况下的行为。 谢谢。

+1

这家公司应该被起诉歧视 - 没有人名字超过8个字符可以通过这个测试! – jasonharper

回答

0

在C中,字符串由它们的地址来表示。当你写"Hello",文字你好将是“地方”在内存放,但如果你确实写了"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位(认识到,指数不在字节边界上开始)。

+0

谢谢,现在我明白了。 – user3708963