铸造签署双倍不同的结果比铸造浮动然后加倍

时间:2014-10-08 16:47:53

标签: c casting twos-complement

因此作为赋值的一部分,我正在使用表达式:(double)(float)x ==(double)x 返回awlays 1或不返回。(x是有符号整数)

它适用于除INT_MAX之外的所有值。我想知道为什么会这样?如果我打印这些值,它们都会显示相同的值,即使是INT_MAX。

x = INT_MAX ;
 printf("Signed X: %d\n",x);
 float fx1 = (float)x;
 double dx1 = (double)x;
 double dfx = (double)(float)x;
 printf("(double) x: %g\n",dx1);
 printf("(float) x: %f \n",fx1);
 printf("(double)(float)x: %g\n",dfx);
 if((double) (float) x == (double) x){
     printf("RESULT:%d\n", ((double)(float) x == (double) x));
 }

编辑:整个计划:

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>

int main(int argc, char *argv[]){



//create random values

  int x = INT_MAX ;


  printf("Signed X: %d\n",x);
  float fx1 = (float)x;
  double dx1 = (double)x;
  double dfx = (double)(float)x;
  printf("(double) x: %g\n",dx1);
  printf("(float) x: %f \n",fx1);
  printf("(double)(float)x: %g\n",dfx);
  if((double) (float) x == (double) x){
      printf("RESULT:%d\n", ((double)(float) x == (double) x));       
  }

  return 0;

} //主要功能结束

1 个答案:

答案 0 :(得分:0)

intfloat很可能在其表示中具有相同的位数,即32. float具有尾数,指数和符号位,因此尾数必须具有小于31位,需要int这样较大的INT_MAX值。因此在float中存储时会导致精度下降。