es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Hex se convierte en decimal incorrecto.

Estoy tratando de leer/escribir números hexadecimales en una matriz de enteros de 2D para mi programa, pero hay problemas con algunos hexadecimales.

Cuando ingreso 272cf50, se convierte correctamente en 41078608 en la matriz y no tengo problemas.

Pero cuando ingreso ffff0000000, en lugar de su equivalente decimal: 17591917608960, se convierte en -268435456.

Debido a esto, cuando intento verificar si ffff0000000 ya existe en la matriz, dice que no, incluso aunque lo escribí en la matriz. Estoy confundido acerca de por qué esto está sucediendo y cómo puedo solucionarlo.

Este es el código:

bool inCache(unsigned long addy, unsigned long blockid, unsigned long setidx, int size, int** cache, int lps){
    //encontrar el índice del conjunto
    //encontrar una forma más fácil
    int i=0;
    while(cache[i][0]!=setidx){
        i++;
    }

    //verificar si el conjunto contiene el blockid
    for(int j=0; j<lps; j++){="" if(cache[i+j][2]="=1" &&="" cache[i+j][1]="=blockid){" return="" true;="" }="" }="" no="" está="" en="" la="" caché="" return="" false;="" }="" void="" read(unsigned="" long="" addy,="" unsigned="" long="" blockid,="" unsigned="" long="" setidx,="" int="" size,="" int**="" cache,="" int="" lps){="" unsigned="" long="" x="blockid;" bool="" e="inCache(addy,blockid,setidx,size,cache,lps);" if(e="=true){" ch++;="" }else{="" cm++;="" mr++;="" colocar="" x="" en="" la="" caché="" newwrite(addy,x,setidx,size,cache,lps);="" }="" }="" void="" newwrite(unsigned="" long="" addy,="" unsigned="" long="" blockid,="" unsigned="" long="" setidx,="" int="" size,="" int**="" cache,="" int="" lps){="" verificar="" si="" ya="" está="" cargado="" en="" la="" caché="" bool="" e="inCache(addy,blockid,setidx,size,cache,lps);" if(e!="true){" cargar="" el="" bloque="" en="" la="" línea="" de="" caché="" elegida="" encontrar="" el="" setidx="" int="" i="0;" while(cache[i][0]!="setidx){" i++;="" }="" recorrer="" el="" conjunto="" y="" ponerlo="" en="" la="" primera="" cacheline="" disponible="" for(int="" j="0;"></lps;><lps; j++){
            if(cache[i+j][2]==0){
                cache[i+j][2]=1;
                cache[i+j][1]=blockid;
                break;
            }
        }

        //si todas las cachelines están llenas, ponerlo en la cacheline menos reciente
        cache[i][1]=blockid;
    }
}

este es el ejemplo específico:

0x1: r 0xffff0000000
0x2: r 0xffff0000000

en mi ejemplo particular, para la primera línea se llama a la función de lectura y como el valor no está en la matriz (caché), llama a la función newwrite para agregarlo a la matriz. cuando se agrega a la caché, es cuando se convierte en -268435456. luego, para la segunda línea, cuando la función de lectura verifica si el valor está en la matriz, devuelve falso en lugar de verdadero. j++){=”” if(cache[i+j][2]=”=0){” cache[i+j][2]=”1;” cache[i+j][1]=”blockid;” break;=”” }=”” }=”” si=”” todas=”” las=”” cachelines=”” están=”” llenas,=”” ponerlo=”” en=”” la=”” cacheline=”” menos=”” reciente=”” cache[i][1]=”blockid;” }=”” }=”” ="" este="" es="" el="" ejemplo="" específico:=""cpp=”” 0x1:=”” r=”” 0xffff0000000=”” 0x2:=”” r=”” 0xffff0000000=”” “`=”” en=”” mi=”” ejemplo=”” particular,=”” para=”” la=”” primera=”” línea=”” se=”” llama=”” a=”” la=”” función=”” de=”” lectura=”” y=”” como=”” el=”” valor=”” no=”” está=”” en=”” la=”” matriz=”” (caché),=”” llama=”” a=”” la=”” función=”” newwrite=”” para=”” agregarlo=”” a=”” la=”” matriz.=”” cuando=”” se=”” agrega=”” a=”” la=”” caché,=”” es=”” cuando=”” se=”” convierte=”” en=”” -268435456.=”” luego,=”” para=”” la=”” segunda=”” línea,=”” cuando=”” la=”” función=”” de=”” lectura=”” verifica=”” si=”” el=”” valor=”” está=”” en=”” la=”” matriz,=”” devuelve=”” falso=”” en=”” lugar=”” de=””></lps; j++){
if(cache[i+j][2]==0){
cache[i+j][2]=1;
cache[i+j][1]=blockid;
break;
}
}

    //si todas las cachelines están llenas, ponerlo en la cacheline menos reciente
    cache[i][1]=blockid;
}

}


este es el ejemplo específico: ```cpp 0x1: r 0xffff0000000 0x2: r 0xffff0000000

en mi ejemplo particular, para la primera línea se llama a la función de lectura y como el valor no está en la matriz (caché), llama a la función newwrite para agregarlo a la matriz. cuando se agrega a la caché, es cuando se convierte en -268435456. luego, para la segunda línea, cuando la función de lectura verifica si el valor está en la matriz, devuelve falso en lugar de verdadero.>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema aquí está en los tipos de datos utilizados para almacenar los valores hexadecimales. La entrada ffff0000000 es demasiado grande para almacenarse como un entero, por lo que se produce un desbordamiento y se convierte en un número negativo. Para solucionar esto, debería utilizarse un tipo de datos más grande para almacenar el valor hexadecimal, como un long o un unsigned long. Esto se puede hacer cambiando el tipo de datos del array de int a long o unsigned long.

    Alternativamente, el valor hexadecimal se puede convertir a decimal antes de almacenarlo en el array. Una forma de hacer esto es utilizando la función strtoul() en C, que convierte una cadena en un entero sin signo de tipo unsigned long. Por ejemplo:

    unsigned long valor = strtoul("ffff0000000", NULL, 16);
    

    Esto convertirá la cadena “ffff0000000” de hexadecimal a un valor entero sin signo de tipo unsigned long de 17591917608960, que luego se puede guardar en el array sin problemas.

Comments are closed.