0

我正在使用 C,在我的程序中,我使用以下代码将变量从 double 类型转换为 int:

x1=(int)((x1+0.25)*2);

出于某种原因,我得到 x1 的值-2147483648.00

我究竟做错了什么?

完整代码:

#include <stdio.h>

int main(){
double x1=-10., y1=15.,x2=10.,y2=15.,t;
int i, Y=0,X=20,j;
char check;
do {            
scanf("%c",&check);

if (check!='T')   
  break;

scanf("ime: %lf ( %lf, %lf), ( %lf, %lf)\n",&t,&x1,&y1,&x2,&y2);    
printf("Time: %.1lf\n",t);

for (i=20; i>=Y; i--) {      
  printf("|");           
  for (j=-20; j<=X; j++) {
if (x1>0)   
  x1=(int)((x1+0.25)*2);   
else if (x1<0)
  x1=(int)((10-0.25)*2);
else 
  x1=0;
if (x2>0)
  x2=(int)((x2+0.25)*2);
    else if (x2<0)
  x2=(int)((x2-0.25)*2);
else 
  x2=0;
(y1>0)?(y1=(int)(y1+0.5)):(y1=(int)(y1-0.5));        
(y2>0)?(y2=(int)(y2+0.5)):(y2=(int)(y2-0.5));
if ((x1==x2)&&(x2==j)&&(y1==y2)&&(y2==i))             
  printf("*");                   
else if ((x1==j) && (y1==i))
  printf("1");
else if ((x2==j) && (y2==i))
  printf("2");
else
  printf(" ");
  } 
  printf("|\n");
}
for (i=0;i<43;i++)
  printf("-");                   
printf("\n");

printf ("x1=%.2lf, y1=%.2lf, x2=%.2lf, y2=%.2lf",x1,y1,x2,y2);
printf("\n");
}
 while (check=='T');     

return 0;
}

输入: 没有星号和空格

Time: 0.00 ( -10.00, 20.00), ( 10.00, 20.00)
Time: 0.10 ( -8.00, 14.95), ( 8.00, 14.95)
Time: 0.20 ( -6.00, 14.80), ( 6.00, 14.80)
Time: 0.30 ( -4.00, 14.56), ( 4.00, 14.56)
Time: 0.40 ( -2.00, 14.22), ( 2.00, 14.22)
Time: 0.50 (  0.00, 13.77), ( 0.00, 13.77)
Boom!
4

2 回答 2

1

这是一个简单的:

您正在尝试类型转换doubleint. 而x2是 远远超出integer range 检查这个: http ://www.cplusplus.com/forum/beginner/44774/

这就是为什么当你试图x2从另一个intdouble另一个时,这是不可能的。

尝试通过删除 typecast for 来运行您的程序x2,然后看看,它正在工作。

您可以在 C 中使用截断 。或者尽管您可以直接添加浮点值,但不会产生太大的影响;但绝对不是一个好的编程习惯。doublemath.h

是的,请以适当的缩进和格式发布程序,以使其更具可读性。

于 2013-10-31T05:38:36.457 回答
0

当我运行您提供的程序时,它x2首先变为 -2,147,483,648,而不是x1.

当您将浮点值转换为 时int,C 标准没有定义浮点值的整数部分的行为在int类型中不可表示。显然,在您使用的系统上:

  • int类型表示从 -2,147,483,648 到 2,147,483,647 的值。
  • 您的程序会在该范围之外创建一个浮点值。
  • 当超出该范围的值转换为 时int,您的 C 实现会生成 -2,147,483,648。

有两个问题:

  • 您需要弄清楚为什么您的程序会产生如此大的值并决定是否要这样做。
  • 当您想要获取浮点值的整数部分时,您应该#include <math.h>使用trunc而不是将其转换为int. 如果您想四舍五入到最接近的整数,请使用round,而不是添加 0.5(如果为负数则减去)并取整数部分。

你的代码本质上是加倍x1x2重复的,不清楚为什么或目标是什么。

于 2013-10-31T05:29:43.143 回答