从double转换为unsigned int

时间:2016-08-03 19:15:39

标签: c++ casting

之间有什么区别
unsigned int n = (n2-n1)/n3 + 1;

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

unsigned int n = (unsigned int)(N);

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

1 个答案:

答案 0 :(得分:2)

  

在被投射到double之前,第一种情况下的右侧表达式是否先计算为unsigned int

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

  

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

舍入通常是比截断更好的策略,特别是如果你期望结果非常接近整数。

标准参考:

§6.3.1.8(通常的算术转换),第2段,附有相关脚注:

  

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

     

63)演员和作曲操作员仍然需要删除额外的范围和精度。