C++ 为什么对于有符号整数,i*=2似乎收敛到0?

C++ 为什么对于有符号整数,i*=2似乎收敛到0?,c++,integer,integer-overflow,C++,Integer,Integer Overflow,考虑以下代码: #include <iostream> int main(int argc, char* argv[]) { int i = /* something */; for (std::size_t n = 0; n < 100; ++n) { i *= 2; std::cout << i << std::endl; } } #包括 int main(int argc,char*argv

考虑以下代码:

#include <iostream>
int main(int argc, char* argv[])
{
    int i = /* something */;
    for (std::size_t n = 0; n < 100; ++n) {
        i *= 2;
        std::cout << i << std::endl;
    }
}
#包括
int main(int argc,char*argv[])
{
int i=/*某物*/;
用于(标准尺寸n=0;n<100;++n){
i*=2;

std::cout想象一下,将一个十进制数重复乘以10。每次进行乘法运算时,十进制表示形式中会增加一个额外的零:

12345         // Initial value
123450        // × 10
1234500       // × 100
12345000      // × 1000
123450000     // × 10000
1234500000    // × 100000
12345000000   // × 1000000
123450000000  // × 10000000
1234500000000 // × 100000000
如果您的数字表示有有限的K位数,并且在乘法后保持较低的K位数,则在最多K次乘法后,结果表示将变为零(对于可被十次幂整除的数字,结果表示将变为零)


同样的事情也发生在二进制数上,因为二进制数的2等于十进制数的10(事实上,二进制数中的2也等于10;任何基数的数字都是如此:数字系统的基数在该系统中写为10).

*2
相当于
它是2的幂,它将始终设置一个位,其余的都为0,在传递整数的32位后,将得到0,然后乘以
0*something=0
。如果我没有弄错的话:)提示:32位可以保存值(2^32)-1.循环将乘以2到100的幂。至少需要一个101位的数字。换句话说,在
n==32时溢出
char**argv[]
main
的非法参数类型。请提供一个引用,其中未定义的行为排除了您看到的结果。如果您了解未定义的行为,并且您知道是您造成了它,为什么您要问为什么会出现行为?您查看了生成的代码吗?您没有向用户提供足够的信息事实上,我们不知道您实际使用的是什么平台,所以给您一个答案,但除非您建议硬件损坏,否则没有答案。它将变为0,因为生成的指令就是这样做的。查看编译器生成的代码,然后根据您的体系结构查找该指令,看看这是什么对base2的观想,就像你对base10的观想一样,会使这个答案更加准确better@NickA不完全是这样:人们习惯用十进制思考。他们在小学就学会了乘十,所以使用十是一个非常强大的工具,可以可视化二进制数学。对我来说,这是一个非常强大的快乐时刻。@dasblinkenlight fro根据我的经验,那些愿意留下评论的人并不是反对者。@das有趣的是,我总是发现在像溢出这样的例子中比较十进制和二进制会令人困惑,因为十进制对我来说总是无限的,而二进制作为有限系统我觉得更有意义,同样,我也没有DV@NickA我的高中编程课老师ss告诉我们,向左移动等于乘以2,但没有给出任何解释。我想了想,试了几个例子,并接受它作为某种CPU魔法。几天后,我突然意识到,当乘以10时,在数字末尾写零与向左移动数字是一样的。这就是我真正的“得到”二进制。