从double转换为无符号int时得到错误结果

Getting wrong result when casting from double to unsigned int

本文关键字:错误 结果 int double 转换 无符号      更新时间:2023-10-16

之间有什么区别

unsigned int n = (n2-n1)/n3 + 1;

double N = (n2-n1)/n3 + 1;
unsigned int n = (unsigned int)(N);

其中n1n2n3doubles?我之所以这么问,是因为对于n1=3n2=4n3=0.1n在第一种情况下得到10,在第二种情况下(至少在我的电脑上)得到11。正确答案是11,所以第一个的结果是错误的。我猜这与unsigned int的截断有关。是这样吗?在转换为unsigned int之前,第一种情况下的右侧表达式是否首先不计算为double(在这种情况下,它将等效于第二段代码)?还有,有没有办法让较短的表达式(第一个)发挥作用?

第一种情况下的右侧表达式在转换为unsigned int之前,是否首先未计算为double

不一定。它可能被计算为long double,这可能导致与double不同的截断。不同的编译器或不同的编译器选项可能会产生不同的结果。

有没有办法让较短的表达式(第一个)发挥作用?

舍入通常是比截断好得多的策略,尤其是当您期望结果非常接近整数时。

标准参考:

&教派;6.3.1.8(常用算术转换),第2段,带相关脚注:

浮动操作数的值和浮动表达式的结果的值可以以比该类型所需的值更大的范围和精度来表示;因此不改变类型。(63)

63)仍然需要强制转换和赋值运算符来消除额外的范围和精度。