具有双重和后续移位操作的C / C ++分区

时间:2014-02-05 16:36:27

标签: c++ c linux casting double

任何人都可以解释为什么以下代码产生不同的结果?

double zaehler = -20;
double teiler = 0.08;
printf("ergebnis = %d \n", ((int) (zaehler/teiler)) << 7 );
printf("ergebnis = %d \n", (int) (-20/0.08) << 7 );

结果:

ergebnis = -31872 
ergebnis = -32000 

非常感谢

1 个答案:

答案 0 :(得分:0)

在64到80位之间的差异可能的范围内,非常小的舍入差异可以解释不同的输出。 truncate to int和shift的组合可以放大一点点差异。这个计划:

#include <stdio.h>
int main(){
    double zaehler = -20;
    double teiler = 0.08;
    printf("ergebnis = %d \n", (int) (zaehler/teiler) );
    printf("ergebnis = %d \n", (int) (-20/0.08));
}

打印:

ergebnis = -249 
ergebnis = -250 

如果除法给出的答案甚至小于250,那么对int的截断将得到249.我建议舍入而不是截断。

Eclipse,MinGW:

Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\\main.cpp" 
g++ -o TestCPP.exe main.o