Некоторое время назад я опубликовал короткую заметку о такого рода вопросов, на моем блоге и короткий ответ:
Always use proper C++ integer types
Длинный ответ: При программировании на C++, это хорошая идея, чтобы использовать правильные целые типы, относящиеся к конкретному контексту. Немного строгости всегда окупается. Нередко наблюдается тенденция игнорировать интегральные типы, определенные как конкретные для стандартных контейнеров, а именно size_type. Он доступен для количества стандартных контейнеров, таких как std :: string или std :: vector. Такое невежество может легко отомстить.
Ниже приведен простой пример неправильного использования типа, чтобы поймать результат функции std :: string :: find. Я совершенно уверен, что многие ожидали, что здесь нет ничего плохого в unsigned int. Но на самом деле это всего лишь ошибка. Я запускаю Linux в 64-битной архитектуре, и когда я компилирую эту программу как есть, она работает так, как ожидалось. Однако, когда я заменить строку в строке 1 с аЬс, он по-прежнему работает, но не как ожидалось :-)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "a:b:c"; // "abc" [1]
char delim = ':';
unsigned int pos = s.find(delim);
if(string::npos != pos)
{
cout << delim << " found in " << s << endl;
}
}
Fix очень просто. Просто замените unsigned int на std :: string :: size_type. Проблему можно было бы избежать, если кто-то, кто написал эту программу, позаботился о правильном типе. Не говоря уже о том, что программа будет переноситься сразу.
Я видел такие проблемы довольно много раз, особенно в коде, написанном бывшими программистами на C, которые не любят носить морду строгости, которую система C++ использует и требует. Приведенный выше пример является тривиальным, но я считаю, что он хорошо описывает корень проблемы.
Я рекомендую блестящую статью 64-bit development, написанную Андреем Карповым, где вы можете найти намного больше информации по этому вопросу.
У вас есть пример, где эта длина трактуется как знаковое? – kroimon
Пример, вероятно, что-то вроде строк: 'len--; if (len <0) {break} ' – Tim