Почему это не работает должным образом, Numeric_limits

У меня есть функция с двумя аргументами: вектор, элементы которого проверяются, и логическая переменная, которую мы вводим как истину или ложь. Если мы введем true, то предполагается, что все элементы, сумма цифр которых является четным числом, будут изолированы и помещены в новый вектор (в том же порядке, в котором они пришли) и возвращен этот вектор. С 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

По какой-то причине он либо игнорирует числовые ограничения, либо не сортирует их с неправильным вектором. И я не знаю, почему. Во всех остальных случаях работает как надо. И, возможно, это переполнение, но я не вижу, где.


person Nane    schedule 20.03.2017    source источник


Ответы (1)


Да, это перелив. Обратите внимание, что в дополнительном представлении целых чисел со знаком до 2 (обычное представление на основных платформах) представляемый диапазон не является симметричным: когда наименьшее представимое число равно -2147483648, тогда максимальное представимое число равно 2147483647.

Таким образом, -2147483648 * -1 означает целочисленное переполнение со знаком и неопределенное поведение, что означает, что программа неверна и может случиться что угодно.

Если вы должны правильно обрабатывать std::numeric_limits<int>::min() независимо от внутреннего представления, вам придется по-другому обращаться с отрицательными числами (например, вычислять сумму цифр в отрицательном значении, а затем просто менять знак вычисленной суммы).

person Angew is no longer proud of SO    schedule 20.03.2017
comment
Вы сделали ошибку в слове представляемый (k вместо l). - person Yoh Deadfall; 20.03.2017