为什么我的输出为负?我乘以2个正数?

问题描述 投票:2回答:2

以下程序的预期输出是第一个完美的平方数,其最后两位数都是奇数(不存在)。因此,不是返回空白屏幕(因为这样的数字不存在),输出是-2147479015,这是负面的。

但代码是cout << i*i,这显然是非负面的。我在网上看了一下,发现了一些关于“溢出”的事情,但我不太清楚溢出是什么。当我谷歌它,我得到的只是溢出攻击,这不是我想知道的。

int main() {
    for(int i =1; ; i++) {
        if(i*i%2 !=0 && i*i/10%2 !=0) {
            cout << i*i;
            return 0;
        }
    }
}

什么是溢出?为什么它会导致我得到一个负数?

c++ integer integer-overflow
2个回答
4
投票

数字变量(如“i”,即“int”)只能包含有限的数字范围。为了演示的目的,让我们说int只能容纳四个不同的数字(显然,一个真正的int可以容纳更多)。这些数字可能是-2,-1,0和1。

如果我有一个int值为0,我加1,我得到一个int,其值为1.但如果我再添加1,我不会得到一个值为2的int。记住,一个int不能可能有值2.它只能有值-2,-1,0或1。

因此,1 + 1将“环绕”:当您“超过”最大可能值时,它将回绕到最小可能值。所以1 + 1 = -2。

那是“溢出”。发生在你身上的是同样的事情,但是乘法而不是加法,当然“int”有很多很多可能的值,而不仅仅是4。


0
投票

在这种情况下,溢出意味着已达到并超过了数据类型的容量。在数据类型为int的情况下,保留最高有效位以指示负值:

(dec)2147483647 = (hex)0x7FFFFFFF

如果向数字2147483647添加1,则将激活负标记(0x80000000)。

从(https://en.cppreference.com/w/cpp/language/types)我给你留下一个图像,其中包含每种数据类型的限制:

enter image description here

使用unsigned long long int而不是int来获得大范围的正值和整数值。

© www.soinside.com 2019 - 2024. All rights reserved.