[英]Typecasting in C -2147483648
我正在使用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!
這很簡單:
您正在嘗試將double
類型轉換為int
。 而x2
超出了integer range
。 檢查此: http : //www.cplusplus.com/forum/beginner/44774/
這就是為什么當您嘗試將x2
從int
再次double
時,這是不可能的。
嘗試通過刪除x2
typecast來運行程序,然后看它是否正在運行。
您可以在C語言中使用math.h
截斷 double
。或者,盡管您可以直接添加浮點值,但不會有太大區別; 但絕對不是一種好的編程習慣。
是的,請以適當的縮進和格式發布程序,以使其更具可讀性。
當我運行您提供的程序時, 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
,而不要加.5(如果是負數則減去)並取整數部分。 您的代碼本質上是將x1
和x2
重復加倍,並且不清楚目標是什么或目標是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.