Почему это не работает должным образом, Numeric_limits
У меня есть функция с двумя аргументами: вектор, чьи элементы тестируются, и переменная bool, которую мы вводим как true или false. Если мы введем 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
По какой-то причине он либо игнорирует числовые ограничения, либо не сортирует их с неправильным вектором. И я не знаю почему. В любых других случаях все работает как надо. И, возможно, это переполнение, но я не вижу, где.
1 ответ
Да, это переполнение. Обратите внимание, что в представлении дополнения 2 целых чисел со знаком (общее представление на основных платформах) представимый диапазон не является симметричным: когда наименьшее представимое число -2147483648
тогда самый представительный 2147483647
,
-2147483648 * -1
поэтому имеет целочисленное переполнение со знаком и неопределенное поведение, что означает, что программа неверна и что-то может произойти.
Если вы должны справиться std::numeric_limits<int>::min()
правильно, независимо от внутреннего представления, вам придется иметь дело с отрицательными числами по-разному (например, вычисление суммы цифр в отрицательном виде, а затем просто обратный знак вычисленной суммы).