我有一个有趣的程序,我想提出一个参数,以便它会触发执行sh实用程序的最后一个条件。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define answer 3.141593
void main(int argc, char **argv) {
float a = (argc - 2)?: strtod(argv[1], 0);
printf("You provided the number %f which is too ", a);
if(a < answer)
puts("low");
else if(a > answer)
puts("high");
else
execl("/bin/sh", "sh", "-p", NULL);
}
我能做到这一点的一种方法是将NAN作为参数。但是,我不明白为什么将3.141593作为参数不会转换为与“answer”变量相同的值。
有人写了一篇关于它的博文,解释如下: http://blog.pkt5.com/2012/09/iosmashthestack-level02alt.html
“这是因为strtod的转换将我们输入的3.141593转换为3.14159298,一个双倍。因此它总是太低了”
为什么将3.141593转换为3.14159298?
答案 0 :(得分:0)
此处的问题是float
无法代表double
可以代表的所有值。考虑这个例子:
double a = 3.141593;
float b = a;
double c = b;
c
等于a
?答案是否定的,因为中间步骤中的精度有所下降,其中值被截断以适合float
。