【问题标题】:Why doesn't it work properly, Numeric_limits为什么它不能正常工作,Numeric_limits
【发布时间】:2017-08-11 16:42:24
【问题描述】:

我有一个带有两个参数的函数,一个正在测试其元素的向量,以及一个我们输入为真或假的布尔变量。如果我们输入 true ,那么它应该隔离所有数字总和为偶数的元素并将其放置到一个新向量中(以它们出现的相同顺序)并返回该向量。假是相反的奇数。而且你只能使用我这里已经用过的东西,没有别的。

这就是它的样子。

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

由于某种原因,它要么忽略数字限制,要么不使用错误的向量对它们进行排序。我不知道为什么。在任何其他情况下,它都可以正常工作。也许它溢出了,但我看不到哪里。

【问题讨论】:

    标签: c++ c++11 numeric-limits


    【解决方案1】:

    是的,这是溢出。注意,在有符号整数的 2 的补码表示(主流平台上常见的表示)中,可表示的范围不是对称的:当可表示的最小数为-2147483648时,则可表示的最高数为2147483647

    -2147483648 * -1 因此是有符号整数溢出和未定义行为,这意味着程序是错误的,任何事情都可能发生。

    如果您应该正确处理 std::numeric_limits&lt;int&gt;::min() 而不管内部表示如何,您将不得不以不同的方式处理负数(例如以负数计算数字总和,然后对计算的总和进行符号反转)。

    【讨论】:

    • 你在“representable”这个词上犯了一个错误(k而不是l)。
    猜你喜欢
    • 2019-11-21
    • 2016-07-16
    • 2019-01-04
    • 2020-09-03
    • 2016-10-10
    • 2016-10-24
    • 2017-02-27
    • 2017-07-08
    • 2014-11-23
    相关资源
    最近更新 更多