关键是这几句 fldl xa fstpl xc(%esp) flds xa fstpl x(%esp) fldl把浮点地址交给浮点运算寄存器浮点寄存器是为精度的然后fstpl再把值取出按照位入栈表象就是按照double类型入栈了 所以虽然内存中单精度浮点数是以字节存储的但编译器把它转成了字节进行处理 所以最后在栈里的存储就成了 | |<——ESP | | | | | | | d | | |<——EBP printf的处理方式是将输入参数按照字符串进行格式化解析由于输入的是ld ld ld ld按照字节依次进行取值就得到了上面的结果 float是单精度浮点遵从IEEE S()E()M()二进制位表示为×^ => 指数部分+= >小数部分为因此其浮点表示为 也就是上面中看到的x打印出的十进制就是 后来又找来台cavium位的机器上跑了一下发现都是正确的即使按照%d方式输出也没有问题没法在cavium上反汇编无法确认 [] [] |