为什么不能正常工作,Numeric_limits
Why doesn't it work properly, Numeric_limits
我有一个带有两个参数的函数,一个其元素正在被测试的向量,以及一个我们输入为 true 或 false 的 bool 变量。如果我们输入 true 那么它应该将所有数字总和为偶数的元素隔离并放置到一个新向量(按照它们出现的相同顺序)和 return 该向量。对于 false,它是相反的,奇数。而且你只能使用我在这里已经用过的几乎所有东西,没有别的。
这是它的样子。
std::vector<int> IzdvojiElemente(std::vector<int> v, bool flag){
std::vector<int> n;
for(int i(0); i<v.size();i++){
int suma(0);
int temp(v[i]);
if(temp<0) temp*=-1;
while(temp>0){
suma+=temp%10;
temp/=10;
}
if(flag && suma%2==0) n.push_back(v[i]);
if(!flag && suma%2!=0) n.push_back(v[i]);
}
return n;
}
这是它不起作用的主要功能之一:
std::vector<int> v1 {1,std::numeric_limits<int>::min(),2, std::numeric_limits<int>::max(),5};
std::vector<int> v2;
v2 = IzdvojiElemente(v1, false);
for(int i=0; i < v2.size(); i++)
std::cout << v2[i] << " ";
这是我应该得到的(作为输出):
1 -2147483648 5
这是我得到的:
1 5
出于某种原因,它要么忽略数字限制,要么不忽略但使用错误的向量对它们进行排序。我不知道为什么。在任何其他情况下,它都可以正常工作。也许它溢出了,但我看不到哪里。
是的,这是溢出。注意,在有符号整数的2的补码表示中(主流平台常用的表示),可表示范围是不对称的:当最低可表示数为-2147483648
时,最高可表示数为2147483647
。
-2147483648 * -1
因此是有符号整数溢出和未定义行为,意味着程序错误,任何事情都可能发生。
如果你应该正确处理 std::numeric_limits<int>::min()
而不管内部表示,你将不得不以不同的方式处理负数(例如计算负数的数字总和,然后只需对计算的总和进行符号反转).
我有一个带有两个参数的函数,一个其元素正在被测试的向量,以及一个我们输入为 true 或 false 的 bool 变量。如果我们输入 true 那么它应该将所有数字总和为偶数的元素隔离并放置到一个新向量(按照它们出现的相同顺序)和 return 该向量。对于 false,它是相反的,奇数。而且你只能使用我在这里已经用过的几乎所有东西,没有别的。
这是它的样子。
std::vector<int> IzdvojiElemente(std::vector<int> v, bool flag){
std::vector<int> n;
for(int i(0); i<v.size();i++){
int suma(0);
int temp(v[i]);
if(temp<0) temp*=-1;
while(temp>0){
suma+=temp%10;
temp/=10;
}
if(flag && suma%2==0) n.push_back(v[i]);
if(!flag && suma%2!=0) n.push_back(v[i]);
}
return n;
}
这是它不起作用的主要功能之一:
std::vector<int> v1 {1,std::numeric_limits<int>::min(),2, std::numeric_limits<int>::max(),5};
std::vector<int> v2;
v2 = IzdvojiElemente(v1, false);
for(int i=0; i < v2.size(); i++)
std::cout << v2[i] << " ";
这是我应该得到的(作为输出):
1 -2147483648 5
这是我得到的:
1 5
出于某种原因,它要么忽略数字限制,要么不忽略但使用错误的向量对它们进行排序。我不知道为什么。在任何其他情况下,它都可以正常工作。也许它溢出了,但我看不到哪里。
是的,这是溢出。注意,在有符号整数的2的补码表示中(主流平台常用的表示),可表示范围是不对称的:当最低可表示数为-2147483648
时,最高可表示数为2147483647
。
-2147483648 * -1
因此是有符号整数溢出和未定义行为,意味着程序错误,任何事情都可能发生。
如果你应该正确处理 std::numeric_limits<int>::min()
而不管内部表示,你将不得不以不同的方式处理负数(例如计算负数的数字总和,然后只需对计算的总和进行符号反转).