2010-05-24 9 views
5

Esta gran aplicación tiene una biblioteca de grupo de memoria que utiliza un identificador interno para almacenar nodos de memoria. El tratamiento se implementa utilizando macros cpp, y se puede encontrar el archivo completo trp.h here. Me sale el siguiente advertencia del compilador cuando intento compilar la aplicación:Descifrando una advertencia del compilador queer sobre la constante decimal sin signo

warning: this decimal constant is unsigned only in ISO C90 

Al eliminar porciones del código de macro y el uso de ensayo y error, finalmente encontré al culpable:

#define trp_prio_get(a_type, a_field, a_node)    \ 
    (2654435761*(uint32_t)(uintptr_t)(a_node)) 

I No estoy seguro de lo que ese número extraño está haciendo allí, pero supongo que está allí por una buena razón, así que solo quiero dejarlo en paz. Sin embargo, quiero arreglar la advertencia, ¿alguna idea de por qué el compilador dice que no está firmado solo en ISO C90?

EDIT: estoy usando gcc-4,1

+0

Sería útil decirnos qué compilador está utilizando. – AndrejaKo

+0

La advertencia también está ahí por una razón.Te dice que el tipo del literal ha cambiado de una versión C a otra, por lo que cualquier buena razón que tuviese el desarrollador original podría estar equivocada, lo que podría romper tu código de maneras interesantes. – gnasher729

Respuesta

6

tratar de sustituir ese número con

2654435761u 

para forzarlo sin firmar.

+0

Funciona bien, gracias :) – artagnon

6

2654435761 es el número áureo correspondiente con 2^32.

En Knuth de "The Art of Computer Programming ", sección 6.4, un esquema multiplicativo hash es introducido como una manera de escribir la función de hash . La clave se multiplica por la proporción áurea de 2^32 (2654435761) a producen un resultado hash.

Desde 2654435761 y 2^32 no tiene factores comunes en común, el multiplicación produce una completa mapeo de la clave hash resultado con hay solapamiento. Este método funciona bastante bien si las claves tienen valores pequeños. Se producen malos resultados hash si las claves varían en los bits superiores. Como es verdadero en todas las multiplicaciones, variaciones de los dígitos superiores no influyen en los dígitos más bajos del resultado de la multiplicación .

http://www.concentric.net/~Ttwang/tech/inthash.htm

+1

¿Qué quiere decir exactamente la proporción áurea de un número? (Y el OP pregunta sobre la advertencia, aunque estoy seguro de que se aprecia el fondo del número). – Cascabel

+0

¿No tiene ningún número impar el atributo "sin factores comunes"? 2^n-1 es 3 * 5 * 17 * 157 * 65537, no hay dos a la vista. ;) –

+0

@Jefromi: http://en.wikipedia.org/wiki/Golden_ratio – Amber

2

creo que es sin firmar porque es más grande que 2147483647, que es el tamaño máximo de entero largo firmado, por lo que con el fin de evitar la envolvente, que está tratando como sin firmar y enviar una alerta.

+0

Gracias por la explicación :) – artagnon

2

El problema es que esta constante 2654435761 es mayor que 2^31. Esto significa que con compiladores más antiguos, en realidad se convertirá en un valor negativo como una constante con signo.

Ahora, en este caso no importa, ya que debido a que se multiplica por un valor sin signo, se convertirá de nuevo a sin firmar, y lo correcto sucederá.

+0

Gracias por la explicación :) – artagnon

Cuestiones relacionadas