之间有什么区别
unsigned int n = (n2-n1)/n3 + 1;
和
double N = (n2-n1)/n3 + 1;
unsigned int n = (unsigned int)(N);
其中n1
,n2
和n3
是double
?我问这个是因为n1=3
,n2=4
和n3=0.1
,n
在第一种情况下得到10,在第二种情况下得到11(至少在我的电脑上)。正确的答案是11,所以第一个的结果是错误的。我猜它与截断到unsigned int
有关。是对的吗?在被转换为double
之前,第一种情况下的右侧表达式是否先计算为unsigned int
(在这种情况下,它将等同于第二段代码)?另外,有没有办法让较短的表达式(第一个)起作用?
答案 0 :(得分:2)
在被投射到
double
之前,第一种情况下的右侧表达式是否先计算为unsigned int
。
不一定。它可能计算为long double
,这可能导致与double
不同的截断。不同的编译器或不同的编译器选项可能会产生不同的结果。
有没有办法让较短的表达式(第一个)起作用?
舍入通常是比截断更好的策略,特别是如果你期望结果非常接近整数。
§6.3.1.8(通常的算术转换),第2段,附有相关脚注:
浮动操作数的值和浮动表达式的结果可以表示在比类型所需的范围和精度更大的范围和精度上;因此不改变类型。 (63)
63)演员和作曲操作员仍然需要删除额外的范围和精度。