对<printf("%f",10/3); 答案是多少?>帖子的小白解释(帮助理解)
打个比方:
在玉米的观念里(printf()对整型数据的浮点解读),春哥(整型)是可爱的女人(未确定值);在我们的眼光里(对整型数据的整型解读),春哥是纯爷们(正解).
你让printf()用玉米的眼光去理解春哥,所以只能告诉你她是可爱的女人...
你竟然来发帖说,omg,春哥怎么会是女人呢?!!
(PS:恶搞无恶意,搞搞别生气)
[解决办法]
楼主,你提的问题非常棒!
解决这个问题,设计cpu对整形数和浮点数的处理是不一样。整数好像是用补码表示,而浮点数采用IEEE754浮点数格式(注:好像还有其他的表示方法,请楼主自己去证实吧)。
#include <stdio.h>
int main()
{
printf("%f", 10/3);
printf("%f", (float)10/3);
return 0;
}
编译成汇编后:
.file"test.c"
.def___main;.scl2;.type32;.endef
.section .rdata,"dr"
LC0:
.ascii "%f\0"
.align 8
LC1:
.long-1610612736
.long1074440874
.text
.globl _main
.def_main;.scl2;.type32;.endef
_main:
pushl%ebp
movl%esp, %ebp
subl$24, %esp
andl$-16, %esp
movl$0, %eax
addl$15, %eax
addl$15, %eax
shrl$4, %eax
sall$4, %eax
movl%eax, -4(%ebp)
movl-4(%ebp), %eax
call__alloca
call___main
movl$3, 4(%esp)
movl$LC0, (%esp)
call_printffldlLC1
fstpl4(%esp)
movl$LC0, (%esp)
call_printfmovl$0, %eax
leave
ret
.def_printf;.scl3;.type32;.endef
比较两段有颜色的代码你可以明白了吧。呵呵,至于那个0,其实是个随机值。