为什么我的输出是负数?我乘以 2 个正数?
Why is my output negative? I am multiplying 2 positive numbers?
以下程序的预期输出是第一个完全平方数,其最后两位数均为奇数(不存在)。因此,不是返回空白屏幕(因为这样的数字不存在),输出是 -2147479015,这是负数。
但是代码是cout << i*i
,显然是非负的。我在网上查了一下,看到了一些关于 "overflow" 的东西,但我不太明白溢出是什么。当我 google 它时,我得到的只是溢出攻击,这不是我想知道的。
int main() {
for(int i =1; ; i++) {
if(i*i%2 !=0 && i*i/10%2 !=0) {
cout << i*i;
return 0;
}
}
}
什么是溢出?为什么会导致我得到负数?
数字变量(如您的 "i",即 "int")只能保存有限范围的数字。为了演示的目的,假设一个 int 只能容纳四个不同的数字(显然,一个真正的 int 可以容纳比这多得多的数字)。这些数字可能是 -2、-1、0 和 1。
如果我有一个值为 0 的 int,我向它加 1,我得到一个值为 1 的 int。但是如果我再添加另一个 1,我会 not 得到一个值为 2 的整数。记住,一个整数不可能有值 2。它只能有值 -2、-1、0 或 1。
因此,1 + 1 将 "wrap around":当您达到 "past" 最大可能值时,它会返回到最小可能值。所以 1 + 1 = -2.
那是 "overflow"。发生在你身上的是同一件事,但乘法而不是加法,当然 "int" 有比四个更多的可能值。
在这种情况下溢出意味着数据类型的容量已经达到并被超越。在数据类型 int
的情况下,保留最高有效位以指示负值:
(dec)2147483647 = (hex)0x7FFFFFFF
.
如果您将数字 2147483647 加 1,则负标志 (0x80000000
) 将被激活。
来自 (https://en.cppreference.com/w/cpp/language/types) 我给你留了一张图片,其中包含每种数据类型的限制:
使用 unsigned long long int
而不是 int
以获得范围广泛的正整数值。
以下程序的预期输出是第一个完全平方数,其最后两位数均为奇数(不存在)。因此,不是返回空白屏幕(因为这样的数字不存在),输出是 -2147479015,这是负数。
但是代码是cout << i*i
,显然是非负的。我在网上查了一下,看到了一些关于 "overflow" 的东西,但我不太明白溢出是什么。当我 google 它时,我得到的只是溢出攻击,这不是我想知道的。
int main() {
for(int i =1; ; i++) {
if(i*i%2 !=0 && i*i/10%2 !=0) {
cout << i*i;
return 0;
}
}
}
什么是溢出?为什么会导致我得到负数?
数字变量(如您的 "i",即 "int")只能保存有限范围的数字。为了演示的目的,假设一个 int 只能容纳四个不同的数字(显然,一个真正的 int 可以容纳比这多得多的数字)。这些数字可能是 -2、-1、0 和 1。
如果我有一个值为 0 的 int,我向它加 1,我得到一个值为 1 的 int。但是如果我再添加另一个 1,我会 not 得到一个值为 2 的整数。记住,一个整数不可能有值 2。它只能有值 -2、-1、0 或 1。
因此,1 + 1 将 "wrap around":当您达到 "past" 最大可能值时,它会返回到最小可能值。所以 1 + 1 = -2.
那是 "overflow"。发生在你身上的是同一件事,但乘法而不是加法,当然 "int" 有比四个更多的可能值。
在这种情况下溢出意味着数据类型的容量已经达到并被超越。在数据类型 int
的情况下,保留最高有效位以指示负值:
(dec)2147483647 = (hex)0x7FFFFFFF
.
如果您将数字 2147483647 加 1,则负标志 (0x80000000
) 将被激活。
来自 (https://en.cppreference.com/w/cpp/language/types) 我给你留了一张图片,其中包含每种数据类型的限制:
使用 unsigned long long int
而不是 int
以获得范围广泛的正整数值。