2010-02-22 13 views
7

Tengo un extraño problema con C++, donde el tipo de datos largos se desborda mucho antes de lo debido. Lo que estoy haciendo (con éxito hasta ahora) es hacer que los enteros se comporten como flotantes, de modo que el rango [-32767,32767] se mapee a [-1.0,1.0]. Donde tropieza con los argumentos es de mayor tamaño que representa flota superior a 1,0:C++ desbordamiento prolongado prematuramente

inline long times(long a, long b) { 
    printf("a=%ld b=%ld ",a,b); 
    a *= b; 
    printf("a*b=%ld ",a); 
    a /= 32767l; 
    printf("a*b/32767=%ld\n",a); 
    return a; 
} 

int main(void) { 
    printf("%ld\n",times(98301l,32767l)); 
} 

Lo que obtengo como salida es:

a=98301 b=32767 a*b=-1073938429 a*b/32767=-32775 
-32775 

así veces (98301,32767) es análoga a 3.0 * 1.0. Este código funciona perfectamente cuando los argumentos a veces son menores que 32767 (1.0), pero ninguno de los pasos intermedios con los argumentos anteriores debe desbordar los 64 bits de longitud.

¿Alguna idea?

+0

¿Puede aceptar la respuesta, hace que las personas estén más dispuestas a ayudarlo en el futuro? –

Respuesta

9

largo no es necesariamente de 64 bits. intente 'long long' en su lugar.

+0

¡Funciona! Gracias a todos los que sugirieron esto, qué lastre. Hace que aprecie mucho más a Java ... – rhodri

+0

@rhodri: long long ni siquiera es necesariamente de 64 bits, por cierto (en ciertas implementaciones). Consulte Boost Integer o vea si su compilador tiene stdint.h. – GManNickG

+1

@GMan: Correcto. Sin embargo, el estándar C garantiza que 'long long' tiene * suficiente alcance * para un entero de 64 bits, y eso suele ser suficiente ... – sleske

2

Probablemente tenga largos de 32 bits. Intenta usar long long en su lugar.

98301 * 32767 = 3221028867, mientras que un largo desbordamientos de 32 bits a 2147483648

4

El tipo long no es necesariamente de 64 bits. Si está en la arquitectura de 32 bits (al menos en MS Visual C++), el tipo long es de 32 bits. Compruébelo con sizeof (long). También está el tipo de datos long long que puede ayudar.

2

El estándar C solo garantiza que long tendrá al menos 32 bit (que en realidad es el caso en la mayoría de las plataformas de 32 bits).

Si necesita 64 bit, use long long. Está garantizado para contener al menos 64 bits.

Cuestiones relacionadas