代码之家  ›  专栏  ›  技术社区  ›  Hammerite

减法运算中的整数溢出类型

  •  0
  • Hammerite  · 技术社区  · 14 年前

    我正在尝试再学习C++,使用SAMS自学C++ 21天(第六版)。我试着把它做得非常彻底,确保我理解每一章(尽管我已经熟悉C语法语言)。

    在第5章(清单5.2)的开头,有一点是关于无符号整数溢出的。根据他们的例子,我写了如下:

    #include <iostream>
    
    int main () {
        unsigned int bignum = 100;
        unsigned int smallnum = 50;
        unsigned int udiff;
        int diff;
        udiff = bignum - smallnum;
        std::cout << "Difference (1) is " << udiff << "\n";
        udiff = smallnum - bignum;
        std::cout << "Difference (2) is " << udiff << "\n";
        diff = bignum - smallnum;
        std::cout << "Difference (3) is " << diff << "\n";
        diff = smallnum - bignum;
        std::cout << "Difference (4) is " << diff << "\n";
        return 0;
    }
    

    这给出了以下输出,这对我来说并不奇怪:

    Difference (1) is 50
    Difference (2) is 4294967246
    Difference (3) is 50
    Difference (4) is -50
    

    如果我更改程序使 bignum 改为读取 unsigned int bignum = 3000000000; 然后输出是

    Difference (1) is 2999999950
    Difference (2) is 1294967346
    Difference (3) is -1294967346
    Difference (4) is 1294967346
    

    第一个显然很好。 1294967346 是因为 1294967346个 正是 2^32 - 3000000000 . 我不明白为什么第二行不读 1294967396 ,由于 smallnum .

    第三个 第四行 我无法解释。这些结果是如何产生的?

    编辑:对于第三行-它仅仅通过找到解的模来给出这个结果吗 2^32

    1 回复  |  直到 14 年前
        1
  •  1
  •   Oliver Charlesworth    14 年前

    2^32-3000000000=1294967296(!)