代码 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 1
可以把有问题的程序反汇编了看看
|
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 1
codeblock 编译器的问题吧,估计是遗留 bug
调试看了下 (int)(a~)为 2 在向 double 类型转换的时候结果错了 其他编译器试了下没遇到这个问题 |
6
kokutou 2020-01-22 20:57:18 +08:00 1
|
9
mxalbert1996 2020-01-22 21:43:54 +08:00 via Android
@l9mhd 你至少应该知道 C++完全兼容 C 吧
|