c++ - unsigned int 和 double 转换顺序

标签 c++ c type-conversion implicit-conversion

我对 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. 1:在下面的内容中,(a2-a1)无符号值为 4294967100 - 4294967290 mod 42949672964294967106
    2:它是由 4294967296 修改的,因为在您的平台上,UINT_MAX4294967295
    3: 4294967106 * 0.1 --> (双)429496710.6
    4:将 (double) 429496710.6 分配给 value1 会产生 (unsigned) 429496710

    unsigned int value1 = (a2 - a1) * double(0.1);
    
  2. 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/

相关文章:

java - 整数到字节不编译

c - 求余运算符在 C 语言中的工作原理

c - 使用 feof() 从文件读取并退出循环

Ruby:4 字节数组到 int32

arrays - 这些类型不应该密切相关吗?

c - LeaveCriticalSection() 是否将缓存的变量刷新到内存中?

c++ - 使用C++输出运算符打印前导零?

c++问题将信息传递给pthreads

android - 如何在 Android 和桌面与 Qt 中使用相机

c++ - 如果队列为空,dequeue 应该返回什么