簡體   English   中英

C中的類型轉換-2147483648

[英]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/

這就是為什么當您嘗試將x2int再次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(如果是負數則減去)並取整數部分。

您的代碼本質上是將x1x2重復加倍,並且不清楚目標是什么或目標是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM