¿La mayoría de los desarrolladores de aplicaciones usan enteros con signo en lugares donde realmente quieren usar enteros sin signo? Lo hago todo el tiempo, al igual que mis compañeros de trabajo. No he visto muchas otras bases de código extensas (aparte de Delphi VCL) y los ejemplos en Internet generalmente usan números enteros. Mientras que los desarrolladores de VCL usan sus propios tipos de datos (que sería la forma más fácil de declarar variables).
Algo parece un poco terrible sobre un código como este
TStuffRec = record
recordID : Integer;
thingID : Integer;
otherThingID : Integer;
end;
cuando podría escribirse como
TStuffRec = record
recordID : Cardinal;
thingID : Cardinal;
otherThingID : Cardinal;
end;
Funcionalmente, estos registros casi siempre funcionan igual (y con suerte continuarán funcionando igual incluso en Delphi de 64 bits). Pero números muy grandes tendrán problemas de conversión.
Pero también hay inconvenientes en el uso de entradas sin signo. Principalmente derivado de lo molesto que es mezclar los dos.
La verdadera pregunta es, ¿es esto algo que realmente se piensa o se incluye en las mejores prácticas? ¿Generalmente depende del desarrollador?
fuente
Respuestas:
Una razón por la que no uso tanto los tipos enteros sin signo en Delphi es que pueden crear problemas cuando se mezclan con enteros con signo. Aquí hay uno que me mordió una vez:
Había
i
declarado como un entero sin signo (después de todo, es un índice en una lista que comienza en 0, nunca tiene que ser negativo, ¿verdad?), Pero cuandoList.Count
era 0, no cortocircuitaría el ciclo como se esperaba porque0 - 1
evalúa a un número positivo muy alto. ¡Uy!Entre los posibles problemas de seguridad inherentes a la mezcla de enteros con y sin signo, y los problemas de rango (si va a necesitar números positivos mayores que
high(signed whatever)
, es muy probable que también termine necesitando números positivos más grandes quehigh(unsigned whatever)
eso, así que muévase hasta el siguiente tamaño más grande en lugar de cambiar de firmado a no firmado del mismo tamaño suele ser la acción correcta,) Realmente no he encontrado demasiados usos para enteros sin signo al representar la mayoría de los datos.fuente
Para ser honesto, tiendo a usar números enteros por costumbre. Me acostumbré al hecho de que ofrecen rangos lo suficientemente grandes para la mayoría de las situaciones y permiten valores negativos (como -1). De hecho, muchas veces usar bytes / palabra / shortint sería más apropiado. Ahora que lo pienso, puedo concentrarme en estos puntos:
Perspectiva. El tamaño del mapa de mosaico está limitado a 192x192 mosaicos, por lo que podría usar el byte para abordar mosaicos y bucles. Pero si se aumenta el tamaño del mapa, tendré que pasar por cada uso y reemplazarlo con, por ejemplo, palabra. Cuando necesito permitir objetos fuera del mapa, tendría que volver a cambiar a smallint.
Bucles. A menudo escribo un bucle "de i: = 0 a Count-1", lo que sucede si "i" es byte y Count = 0 es que el bucle va de 0 a 255. No es que lo quiera.
Uniforme Es más fácil recordar y aplicar "var i: integer"; que detenerse en cada caso y pensar "Hm ... aquí estamos tratando con 0..120 rango ... byte ... no, espera, podríamos necesitar -1 para no inicializado ... abreviatura ... espera ... ¿y si 128 es no es suficiente .. Arrgh! " o "¿Por qué es una moneda pequeña en este lugar, no una moneda corta?"
Combinatorio. Cuando necesito combinar dos o más clases juntas, pueden estar usando diferentes tipos de datos para sus propósitos, el uso de tipos más amplios permite omitir conversiones innecesarias.
-1. Incluso cuando los valores están en el rango 0..n-1, a menudo necesito establecer el valor "sin valor / desconocido / sin inicializar / vacío", que es una práctica común -1.
El uso de números enteros permite omitir todos estos problemas, olvidarse de la optimización de bajo nivel donde no es necesario, subir de nivel y centrarse en problemas más reales.
PD: ¿Cuándo uso otros tipos?
fuente
La mejor práctica es utilizar un tipo de datos que se ajuste a las necesidades de los datos que se utilizan (datos esperados).
Ejemplos de C #: si solo necesitara admitir 0 a 255, usaría un byte.
Si necesitaba soportar 1,000,000 negativos y positivos, entonces int.
Más grande que 4.2 mil millones, luego use un largo.
Al elegir el tipo correcto, el programa usará la cantidad óptima de memoria, así como los diferentes tipos usan diferentes cantidades de memoria.
Aquí hay una referencia de C # int de MSDN.
fuente
Integer
tipo de datos es de 32 bits en una máquina de 32 bits y aparentemente será de 64 bits en una máquina de 64 bits.int
es solo una abreviatura deSystem.Int32
, sin importar en qué máquina se ejecute el código.type int System.Int32
o algo así? ¿Podría cambiarse tan fácilmente en una versión futura del marco?uint
es uno de esos tipos no conformes, lo que significa que no debe usarse en API expuesta públicamente para evitar romper la capacidad de usar esa API en lenguajes .NET distintos del que está escrita la biblioteca. Esta es también la razón por la cual el marco .NET La API en sí está usandoint
whereuint
would would.Los tipos enteros sin signo solo deben usarse para representar números cardinales en idiomas donde representan números cardinales. Debido a la forma en que funcionaban las computadoras que ejecutaban C, los tipos enteros sin signo se comportaban como miembros de anillos algebraicos mod-2 ^ n (lo que significa que los cálculos que se desbordarían se "envolverían" de manera predecible), y el lenguaje especifica que en muchos casos tales tipos son requiere comportarse como anillos algebraicos abstractos incluso cuando dicho comportamiento sería inconsistente con el comportamiento de números cardinales o enteros matemáticos.
Si una plataforma admite tipos separados para números cardinales y anillos algebraicos, entonces sugeriría que los números cardinales se procesen usando tipos de números cardinales (y cosas que deben ajustarse usando los tipos de anillo). No solo estos tipos podrían almacenar números dos veces más grandes que los tipos con signo, sino que un método que recibe un parámetro de ese tipo no tendría que verificar si era negativo.
Sin embargo, dada la relativa falta de tipos de números cardinales, generalmente es mejor simplemente usar números enteros para representar números enteros matemáticos y números cardinales.
fuente