Hace algún tiempo he publicado una breve nota sobre este tipo de cuestiones en mi blog y la respuesta corta es:
Always use proper C++ integer types
Respuesta larga: Al programar en C++, que es una buena idea usar tipos enteros apropiados relevantes al contexto particular. Un poco de rigor siempre paga. No es raro ver una tendencia a ignorar los tipos integrales definidos como específicos para los contenedores estándar, a saber, size_type. Está disponible para varios contenedores estándar como std :: string o std :: vector. Tal ignorancia puede vengarse fácilmente.
A continuación se muestra un ejemplo simple del tipo incorrectamente utilizado para capturar el resultado de la función std :: string :: find. Estoy bastante seguro de que muchos esperarían que no haya nada de malo con el int sin firmar aquí. Pero, en realidad, esto es solo un error. Ejecuto Linux en una arquitectura de 64 bits y cuando compilo este programa tal como está, funciona como se esperaba. Sin embargo, cuando se sustituye la cadena en la línea 1 con ABC, que todavía funciona, pero no como se esperaba :-)
#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 es muy simple. Simplemente reemplace unsigned int con std :: string :: size_type. El problema podría evitarse si alguien que escribió este programa se encargó del uso del tipo correcto. Sin mencionar que el programa sería portátil de inmediato.
He visto este tipo de problemas muchas veces, especialmente en el código escrito por antiguos programadores de C que no les gusta usar el bozal de rigor que el sistema de tipos de C++ exige y exige. El ejemplo anterior es trivial, pero creo que presenta bien la raíz del problema.
Recomiendo brillante artículo 64-bit development escrito por Andrey Karpov donde puede encontrar mucho más sobre el tema.
¿Tiene un ejemplo en esta longitud es tratado como firmado? – kroimon
El ejemplo probablemente sea algo así como: 'len--; if (len <0) {break} ' – Tim