要理解这个事儿,得知道俩问题
一个是printf函数遇到%f的时候,就会把后面传递的对应参数压栈后的值理解为double类型。
你送过去的i按照平台不同,一般是32位或者16位,而printf要按照double,也就是64位来理解它,那么这时就会在栈底后面多占用一些位,而这些位的值我们假设都是0(否则也可以认为是随机值)。
第二是浮点数存储格式,双精度浮点数从高位开始是1位符号,11位阶码,52位尾数
按照上面说的,64位里面的高32位(甚至48位)都是0,那就是说阶码部分都是0,都是0的阶码表示尾数要乘以2的-1023次方,这样一来,你的i充当的尾数部分无论是多少,乘以2的-1023次方以后都非常小了,你用%f输出的仅仅有小数点后面6位,当然都是0了。