我对 unsigned int 和 double 转换顺序感到困惑。我认为在计算表达式时,中间类型是表示集合中基数最大的类型,但在代码中
unsigned int a1 = 4294967290, a2 = 4294967100;
unsigned int value1 = (a2 - a1) * double(0.1);
std::cout << value1 << std::endl;
unsigned int value2 = int(a2 - a1)* double(0.1);
std::cout << value2 << std::endl;
当使用 Microsoft 编译器进行编译时,我收到以下结果:
值1 = 429496710 值2 = 4294967277
而我认为答案的直接类型应该是 double,因此values1和values2应该相等
我哪里错了?
最佳答案
1:在下面的内容中,
(a2-a1)
的无符号
值为4294967100 - 4294967290 mod 4294967296
或4294967106
。
2:它是由4294967296
修改的,因为在您的平台上,UINT_MAX
是4294967295
。
3:4294967106 * 0.1
-->(双)429496710.6
4:将(double) 429496710.6
分配给value1
会产生(unsigned) 429496710
。unsigned int value1 = (a2 - a1) * double(0.1);
1:有了下面的,就更复杂了。
a2-a1
的无符号
值为4294967106
。该值被转换为 int() 并导致未指定/未定义的行为,如 @Yakk 建议的那样。典型结果为4294967106 - 4294967296
或-190
类型。
2:-190 * 0.1
-->(双)-19.0
3:将(double) -19.0
分配给value2
是一个问题,因为它对于无符号
来说是负数,再次遇到 UB。< br/> 4:value2
被分配了(无符号)4294967277
的值,该值与您平台上的(int) -19
的位模式相同。unsigned int value2 = int(a2 - a1)* double(0.1);
关于c++ - unsigned int 和 double 转换顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21139088/