Dado que .NET es más nuevo que C ++, algo me dice que puede haber problemas al usar int sin firmar incluso para cosas que "no pueden" ser negativas como un índice de matriz o longitud.
Si. Para ciertos tipos de aplicaciones, como el procesamiento de imágenes o el procesamiento de matrices, a menudo es necesario acceder a elementos relativos a la posición actual:
sum = data[k - 2] + data[k - 1] + data[k] + data[k + 1] + ...
En este tipo de aplicaciones, no puede realizar la verificación de rango con enteros sin signo sin pensar detenidamente:
if (k - 2 < 0) {
throw std::out_of_range("will never be thrown");
}
if (k < 2) {
throw std::out_of_range("will be thrown");
}
if (k < 2uL) {
throw std::out_of_range("will be thrown, without signedness ambiguity");
}
En su lugar, debe reorganizar su expresión de verificación de rango. Esa es la principal diferencia. Los programadores también deben recordar las reglas de conversión de enteros. En caso de duda, vuelva a leer http://en.cppreference.com/w/cpp/language/operator_arithmetic#Conversions
Muchas aplicaciones no necesitan usar índices de matriz muy grandes, pero sí necesitan realizar comprobaciones de rango. Además, muchos programadores no están entrenados para hacer esta gimnasia de reordenamiento de expresiones. Una sola oportunidad perdida abre la puerta a una hazaña.
C # está diseñado para aquellas aplicaciones que no necesitarán más de 2 ^ 31 elementos por matriz. Por ejemplo, una aplicación de hoja de cálculo no necesita lidiar con tantas filas, columnas o celdas. C # se ocupa del límite superior al tener aritmética comprobada opcional que se puede habilitar para un bloque de código con una palabra clave sin alterar las opciones del compilador. Por esta razón, C # favorece el uso de enteros con signo. Cuando estas decisiones se consideran por completo, tiene sentido.
C ++ es simplemente diferente y es más difícil obtener el código correcto.
Con respecto a la importancia práctica de permitir que la aritmética firmada elimine una posible violación del "principio del menor asombro", un caso en cuestión es OpenCV, que utiliza un entero de 32 bits con signo para el índice de elementos de la matriz, el tamaño de la matriz, el recuento de canales de píxeles, etc. Imagen El procesamiento es un ejemplo de dominio de programación que utiliza mucho el índice de matriz relativa. El desbordamiento de enteros sin signo (resultado negativo envuelto) complicará gravemente la implementación del algoritmo.
-1
se devuelve desde funciones que devuelven un índice, para indicar "no encontrado" o "fuera de rango". También se devuelve de lasCompare()
funciones (implementaciónIComparable
). Un int de 32 bits se considera ir a escribir para un número general, por lo que espero sean razones obvias.