Pregunta

¿Cuál es la justificación del uso de números con signo como índices en .Net?

En Python, puede índice del final de una matriz mediante el envío de números negativos, pero esto no es el caso en .Net. No es fácil para .Net para añadir una característica tan tarde, ya que podría romper otro código tal vez usando reglas especiales (sí, una mala idea, pero supongo que sucede) en la indexación.

No es que yo he tenido necesidad de matrices índice sobre 2147483647 en tamaño, pero realmente no puedo entender por qué eligen números con signo.

¿Puede ser porque es más normal utilizar números con signo en el código?

Edit: Acabo de encontrar estos enlaces:

Los peligros de no firmado iteración en C / C ++

longitudes y los índices de palabras Firmado

Edit2: Ok, un par de otras buenas razones de la rosca Mateo Flaschen colocado:

  • razones históricas ya que es un C-como el lenguaje
  • interoperabilidad con c
¿Fue útil?

Solución

Para simplificar, por supuesto. ¿Te gusta problemas hacer aritmética tamaño con enteros sin signo?

Otros consejos

Puede ser a la larga tradición de utilizar un valor inferior a 0 como un índice válido. Métodos como String.IndexOf devuelven -1 si no se encuentra el elemento. Por lo tanto, el valor de retorno debe ser firmado. Si index-consumidores requerirían valores sin signo, que tendría que a) cheque y b) convertir el valor de usarlo. Con índices firmados, sólo tiene el cheque.

Sin signo no es compatible con CLS.

La utilidad principal de números sin signo surge la hora de componer un mayor número de los más pequeños y viceversa. Por ejemplo, si uno recibe cuatro bytes sin signo de una conexión y desea considerar su valor, tomada como un todo, como un entero de 32 bits, utilizando medios tipos sin signo uno puede simplemente decir:

  value = byte0 | (byte1*256) | (byte2*65536) | (byte3*16777216);

Por el contrario, si la firma de los bytes, una expresión como la anterior, sería más complicado.

No estoy seguro de que realmente ve ninguna razón para que un lenguaje diseñado hoy en día no incluir versiones sin firmar de todos los tipos más corto que el tipo entero más larga firmado, con la semántica que todos entero (es decir, en la cantidad discretos-numéricos, en lugar de cualquier tipo de operaciones particulares), que se ajuste por completo dentro del tipo más grande firmado por defecto serán realizadas como si que operaban en ese tipo. Incluyendo una versión sin firmar del tipo firmado más grande que complicaría la especificación del lenguaje (ya que se tendría que especificar qué operaciones deben encajar dentro del alcance del tipo firmado, y que las operaciones deben encajar dentro del alcance del tipo sin signo), pero por lo demás no debería haber no hay problema de diseñar un lenguaje para que if (unsigned1 - unsigned2 > unsigned3) produciría un "numéricamente correcta" resultar incluso cuando unsigned2 es mayor que unsigned1 [si uno quiere envolvente sin firmar, se podría especificar explícitamente if ((Uint32)(unsigned1 - unsigned2) > unsigned3)]. Un lenguaje que especifica tal comportamiento sería sin duda una gran mejora sobre el desorden que existe en C (justificable, dada su historia), C # o vb.net.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top