C++ 向0舍入整数到浮点

C++ 向0舍入整数到浮点,c++,c,C++,C,当我做以下事情时: long x1 = LONG_MAX; float x2 = x1; long x3 = x2; x1 = 2147483647 x2 = 2147483648 x3 = -2147483648 我得到以下信息: long x1 = LONG_MAX; float x2 = x1; long x3 = x2; x1 = 2147483647 x2 = 2147483648 x3 = -2147483648 有没有办法从x1到x2向0(甚至是向负无穷大)进位呢?一般来说

当我做以下事情时:

long x1 = LONG_MAX;
float x2 = x1;
long x3 = x2;
x1 = 2147483647
x2 = 2147483648
x3 = -2147483648
我得到以下信息:

long x1 = LONG_MAX;
float x2 = x1;
long x3 = x2;
x1 = 2147483647
x2 = 2147483648
x3 = -2147483648

有没有办法从x1到x2向0(甚至是向负无穷大)进位呢?

一般来说,这并不能解决您的问题,但是如果您使用double而不是float,那么如果long是32位,这就行了

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

int main() {
  long x1 = LONG_MAX;
  double x2 = x1;
  long x3 = x2;

  printf("x1 = %d\n", x1);
  printf("x2 = %f\n", x2);
  printf("x3 = %d\n", x3);
}
#包括
#包括
int main(){
长x1=长_最大值;
双x2=x1;
长x3=x2;
printf(“x1=%d\n”,x1);
printf(“x2=%f\n”,x2);
printf(“x3=%d\n”,x3);
}

也许您对标准IEEE 754感兴趣

链接到libc;我不确定这是否作为语言本身的一部分得到了标准化

我想这是可行的(未经测试):

#包括
int save_round_mode=fegetround();
fesetround(feu向零);
/*在这里做事*/
fesetround(保存循环模式);
您应该阅读IEEE-754的相关信息

如果2147483648转换为浮点,则如下所示

(1).0000...000 x 2 power 32  NOTICE there are twenty-three '0's after the point
完全等于2147483648

但是,对于2147483647,不可能存储整数的“所有信息”。因此,必须将其转换为与2147483648相同的浮点值

让我们看看最接近2147483647的较小浮动,它是

(1).1111...111 x 2 power 31  NOTICE there are twenty-three '1's after the point
这个数字是2147483520,远高于2147483647的2147483648


所以你知道为什么它必须是2147483648。

Jay发布了一个正确的答案,然后删除了它……这些函数实际上是C99标准的一部分,来自头文件
。然而,要小心编译器优化,你可能需要在你的代码周围加一个
#pragma STDC FENV_访问打开
/
#pragma STD FENV_访问关闭
块。。。也许,你的意思是你想得到答案“2147483520”?对于小数部分,我们提到了舍入模式,但对于整数部分,我们没有提到舍入模式。例如,1.6向0舍入为1.0。