
代码 1
#include<stdio.h> int main(){ double a,b; a = 0.15; b = (int)( a*10+0.5 ); printf("%.1f",b); return 0; } 输出 1.0
代码 2
#include<stdio.h> int main(){ double a,b; a = 0.15; b = a*10+0.5; b = (int)b; printf("%.1f",b); return 0; } 输出 2.0
之后用线上编译器( https://rextester.com/l/c_online_compiler_gcc ) 测试,两段代码结果一致,都是 2.0 。
从官网中重新下载安装,但是问题没有解决,运行结果仍然不一致。
谢谢!
反编译结果如下:
Project title : test Project path : F:\test\ Frame function: main (F:\test\main.c:8) Frame address : 0x60ff10 -------------------------------------------------------------------------------- 0x401350 push %ebp 0x401351 mov %esp,%ebp 0x401353 and $0xfffffff0,%esp 0x401356 sub $0x30,%esp 0x401359 call 0x401970 <__main> 0x40135e fldl 0x403030 0x401364 fstpl 0x28(%esp) 0x401368 fldl 0x28(%esp) 0x40136c fldl 0x403038 0x401372 fmulp %st,%st(1) 0x401374 fldl 0x403040 0x40137a faddp %st,%st(1) 0x40137c fnstcw 0x1e(%esp) 0x401380 movzwl 0x1e(%esp),%eax 0x401385 mov $0xc,%ah 0x401387 mov %ax,0x1c(%esp) 0x40138c fldcw 0x1c(%esp) 0x401390 fistpl 0x14(%esp) 0x401394 fldcw 0x1e(%esp) 0x401398 fildl 0x14(%esp) 0x40139c fstpl 0x20(%esp) 0x4013a0 fldl 0x20(%esp) 0x4013a4 fstpl 0x4(%esp) 0x4013a8 movl $0x403028,(%esp) 0x4013af call 0x401be0 <printf> 0x4013b4 mov $0x0,%eax 0x4013b9 leave 0x4013ba ret 1 des 2020-01-22 19:19:43 +08:00 via Android 可以把有问题的程序反汇编了看看 |
2 kokutou 2020-01-22 19:41:34 +08:00 你可以 1 以后都用代码 2 的写法。 2 以后都不要强制转类型。 |
3 l9mhd OP @des 您好!我把代码 1 反编译出来的 txt 复制到附言上了。 小红点在开头和结尾,然后编译的,不过我不明白这些是什么意思,能麻烦您看一看吗? |
4 l9mhd OP @kokutou 我目前正在学习编程,我不太确定这是不是软件的问题,有点担心在代码中出现了这样的情况以后会难以辨别出来。 关于强制转类型,这段代码,a 赋值输入的内容,b 再除以 10,用于保留小数后一位(四舍五入),在这里强制转类型是用于省略去小数部分的值,我不知道有没有别的实现方式。 |
5 Cielsky 2020-01-22 20:50:29 +08:00 via Android codeblock 编译器的问题吧,估计是遗留 bug 调试看了下 (int)(a~)为 2 在向 double 类型转换的时候结果错了 其他编译器试了下没遇到这个问题 |
6 kokutou 2020-01-22 20:57:18 +08:00 |
9 mxalbert1996 2020-01-22 21:43:54 +08:00 via Android @l9mhd 你至少应该知道 C++完全兼容 C 吧 |