versiones style significado sang psy pocoyo park otras oppa letra jayesslee jae gangnam esta español canción c++ styles int 32-bit unsigned

c++ - style - park jae-sang



Asesoramiento en unsigned int(edición de Gangnam Style) (5)

Esta guía es extremadamente engañosa. El uso ciego de int lugar de unsigned int no resolverá nada. Eso simplemente cambia los problemas en otro lugar. Es absolutamente necesario tener en cuenta el desbordamiento de enteros al realizar operaciones aritméticas en enteros de precisión fija. Si su código está escrito de una manera que no maneja el desbordamiento de enteros con gracia para algunas entradas dadas, entonces su código se rompe independientemente de si usa unsigned int s signed o unsigned int . Con unsigned int s unsigned int también debe tener en cuenta el flujo inferior de enteros, y con s double y float debe tener en cuenta muchos problemas adicionales con la aritmética de punto flotante.

Simplemente tome este artículo sobre un error en el algoritmo de búsqueda binario de Java estándar publicado por Google, por qué debe tener en cuenta el desbordamiento de enteros. De hecho, ese mismo artículo muestra la conversión de código C ++ a unsigned int para garantizar el comportamiento correcto . El artículo también comienza presentando un error en Java en el que adivina qué, no tienen unsigned int . Sin embargo, todavía se encontraron con un error con el desbordamiento de enteros.

El video "Estilo de Gangnam" (estoy seguro de que lo has escuchado) solo superó los 2 mil millones de visitas en YouTube. De hecho, Google dice que nunca esperaron que un video fuera mayor que un entero de 32 bits ... lo que alude al hecho de que Google usó int lugar de unsigned para su contador de visitas. Creo que tuvieron que reescribir un poco su código para dar cabida a vistas más grandes.

Revisando su guía de estilo: https://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Integer_Types

... recomiendan "no usar un tipo de entero sin signo" y dan una buena razón por la cual: unsigned podría tener errores.

Es una buena razón, pero podría tener cuidado. Mi pregunta es: ¿es una mala práctica de codificación en general utilizar unsigned int ?


Google afirma que: "Algunas personas, incluidos algunos autores de libros de texto, recomiendan el uso de tipos unsigned para representar números que nunca son negativos. Esto pretende ser una forma de autodocumentación".

Personalmente uso unsigned int como parámetros de índice.

int foo(unsigned int index, int* myArray){ return myArray[index]; }

Google sugiere: "Documente que una variable no es negativa usando aserciones. No use un tipo sin signo".

int foo(int index, int* myArray){ assert(index >= 0); return myArray[index]; }

Pro para Google: si se pasa un número negativo en el modo de depuración, mi código devolverá un error fuera de límites. El código de Google está garantizado para afirmar.

Pro para mí: mi código puede admitir un mayor tamaño de myArray .

Creo que el factor decisivo real se reduce a, ¿qué tan limpio es su código? Si limpia todas las advertencias, quedará claro cuando el compilador le avise que sabe cuando está tratando de asignar una variable con signo a una variable sin signo. Si su código ya tiene muchas advertencias, la advertencia del compilador se perderá en usted.

Una nota final aquí: Google dice: "A veces, gcc notará este error y te advertirá, pero a menudo no lo hará". No he visto que ese sea el caso en Visual Studio, las advertencias contra números negativos y las asignaciones de firmado a no firmado siempre están advertidas. Pero si usa gcc puede que tenga cuidado.


La regla de Google es ampliamente aceptada en los círculos profesionales. El problema es que los tipos integrales sin signo están rotos y tienen un comportamiento inesperado y poco natural cuando se usan para valores numéricos; No funcionan bien como un tipo cardinal. Por ejemplo, un índice en una matriz nunca puede ser negativo, pero tiene mucho sentido escribir abs(i1 - i2) para encontrar la distancia entre dos índices. Lo cual no funcionará si i1 e i2 tienen tipos sin firmar.

Como regla general, esta regla particular en las pautas de estilo de Google corresponde más o menos a lo que pretenden los diseñadores del idioma. Cada vez que vea algo distinto de int , puede asumir una razón especial para ello. Si es debido al rango, será long o long long o incluso int_least64_t . El uso de tipos sin signo es generalmente una señal de que está tratando con bits, en lugar del valor numérico de la variable, o (al menos en el caso de caracteres unsigned char ) que está tratando con memoria en bruto.

Con respecto a la "autodocumentación" del uso de un unsigned : esto no se sostiene, ya que casi siempre hay muchos valores que la variable no puede (o no debe) tomar, incluidos muchos positivos. C ++ no tiene tipos de sub-rango, y la forma en que se define unsigned significa que en realidad tampoco puede usarse como uno solo.


Tu pregunta específica es:

"¿Es una mala práctica usar sin firmar?" a lo que la única respuesta correcta puede ser no. No es una mala práctica.

Hay muchas guías de estilo, cada una con un enfoque diferente, y mientras que en algunos casos, una organización, dada su cadena de herramientas y plataforma de implementación típica, puede elegir no usar sin firma para sus productos, otras cadenas de herramientas y plataformas casi exigen su uso.

Google parece tener mucha deferencia porque tienen un buen modelo de negocio (y probablemente emplean a algunas personas inteligentes como todos los demás).

CERT IIRC recomienda no estar firmado para los índices de búfer, porque si realiza un desbordamiento, al menos todavía estará en su propio búfer, con seguridad intrínseca.

¿Qué dicen los diseñadores de bibliotecas de idiomas y estándares (probablemente la mejor representación de la sabiduría aceptada)? strlen devuelve un size_t, que probablemente no esté firmado (depende de la plataforma), otras respuestas sugieren que esto es un anacronismo porque las computadoras nuevas y brillantes tienen arquitecturas amplias, pero esto no tiene en cuenta que C y C ++ son lenguajes de programación generales y deberían escalar bien en grandes y pequeños plataformas

La conclusión es que esta es una de las muchas preguntas religiosas; ciertamente no está resuelto, y en estos casos, normalmente voy con mi religión para desarrollos de campos verdes, y con la convención existente de la base de código para el trabajo existente. La consistencia importa.


Utilice el tipo correcto para las operaciones que realizará. float no tendría sentido para un contador. Tampoco signed int . Las operaciones normales en el contador son print y +=1 .

Incluso si tuvieras algunas operaciones inusuales, como imprimir la diferencia en las cuentas de visualización, no necesariamente tendrías un problema. Claro, otras respuestas mencionan los abs(i2-i1) incorrectos abs(i2-i1) pero no es irrazonable esperar que los programadores usen el max(i2,i1) - min(i2,i1) correcto max(i2,i1) - min(i2,i1) . Que tiene problemas de rango para signed int . No hay solución uniforme aquí; Los programadores deben entender las propiedades de los tipos con los que están trabajando.