Недавно я обнаружил ошибку в своем коде, на отладку которой у меня ушло несколько часов.
проблема была в функции, определенной как:
unsigned int foo(unsigned int i){
long int v[]={i-1,i,i+1} ;
.
.
.
return x ; // evaluated by the function but not essential how for this problem.
}
Определение v не вызвало никаких проблем на моей машине разработки (32-разрядная версия Ubuntu 12.04, компилятор g++), где беззнаковые целые числа были неявно преобразованы в длинные целые числа, и поэтому отрицательные значения обрабатывались правильно.
Однако на другой машине (64-разрядная версия Ubuntu 12.04, компилятор g++) эта операция была небезопасной. Когда i=0, v[0] было установлено не в -1, а в какое-то странное большое значение (как это часто бывает при попытке сделать unsigned int отрицательным).
Я мог бы решить проблему приведения значения i к long int
long int v[]={(long int) i - 1, (long int) i, (long int) i + 1};
и все работало нормально (на обеих машинах).
Я не могу понять, почему первый отлично работает на машине и не работает на другом.
Можете ли вы помочь мне понять это, чтобы я мог избежать этой или других проблем в будущем?