Dev - C++ - Leer de la memoria RAM

 
Vista:
sin imagen de perfil
Val: 21
Ha disminuido su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Leer de la memoria RAM

Publicado por eltelegramon (21 intervenciones) el 02/02/2017 03:54:35
En un programa que estoy haciendo, tengo que manejar el valor de una variable double, byte a byte. Para eso he hecho el siguiente programa:
1
2
3
4
5
6
7
8
9
10
double d1 = 10;
    unsigned char charval[sizeof(d1)];
    unsigned int int2;
 
    memcpy(charval, &d1, sizeof(d1));
 
    for (int a1=0;a1<sizeof(d1);a1++){
        int2 = charval[a1];
        out1 << int2 << " / "; // El out1 es un stream que escribe en el disco duro.
    }
Para los valores de d1 siguientes, el resultado es el siguiente;

d1 = 0 ---------- 0 / 0 / 0 / 0 / 0 / 0 / 0 / 0 /

d1 = 1 ---------- 0 / 0 / 0 / 0 / 0 / 0 / 240 / 63 /

d1 = 2 ---------- 0 / 0 / 0 / 0 / 0 / 0 / 0 / 64 /

d1 = 3 ---------- 0 / 0 / 0 / 0 / 0 / 0 / 8 / 64 /

d1 = 4 ---------- 0 / 0 / 0 / 0 / 0 / 0 / 16 / 64 /

d1 = 5 ---------- 0 / 0 / 0 / 0 / 0 / 0 / 20 / 64 /

d1 = 6 ---------- 0 / 0 / 0 / 0 / 0 / 0 / 24 / 64 /

d1 = 7 ---------- 0 / 0 / 0 / 0 / 0 / 0 / 28 / 64 /

d1 = 8 ---------- 0 / 0 / 0 / 0 / 0 / 0 / 32 / 64 /

d1 = 9 ---------- 0 / 0 / 0 / 0 / 0 / 0 / 34 / 64 /

d1 = 10 --------- 0 / 0 / 0 / 0 / 0 / 0 / 36 / 64 /

¿Que orden lógico sigue esto?
¿El programa que he hecho es correcto?
¿Como puedo saber el formato de escritura en la memoria RAM de las variables double?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 21
Ha disminuido su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Leer de la memoria RAM

Publicado por eltelegramon (21 intervenciones) el 03/02/2017 11:27:36
He probado las tres formas que pone en donde dices.

1) Con union me da lo mismo que con memcpy.

2) Asignando el valor de tipo double a uno tipo char, con un puntero, como pone:

1
2
3
4
5
6
7
unsigned double d1;
unsigned char charval;
unsigned double *ptr;
 
d1=10;
ptr=&d1;
charval=*ptr;

Si que pasa el valor de double a char, pero luego no puedo leer el array para manejar los bytes:

1
int2=charval[0]; //Me da error: invalid types 'unsigned char[int]' for array subscript

Y si pongo:

1
2
3
unsigned char charval[sizeof(d1)];
 
charval=*ptr;  //Me da error: incompatible types in assignment of 'double' to 'unsigned char [8]'|


3) La otra forma tampoco me sirve, pero me ha dado una idea. Ahora copio el double en un array de 16 bytes

1
2
3
unsigned short int int1[4];
 
memcpy(int1, &d1, 8);

y lo miro en binario. Da como sigue:

d1 = 0 ------- los ultimos 16 bits 0000000000000000
d1 = 1 ------- los ultimos 16 bits 0011111111110000
d1 = 2 ------- los ultimos 16 bits 0100000000000000
d1 = 3 ------- los ultimos 16 bits 0100000000001000
d1 = 4 ------- los ultimos 16 bits 0100000000010000
d1 = 5 ------- los ultimos 16 bits 0100000000010100
d1 = 6 ------- los ultimos 16 bits 0100000000011000
d1 = 7 ------- los ultimos 16 bits 0100000000011100
d1 = 8 ------- los ultimos 16 bits 0100000000100000
d1 = 9 ------- los ultimos 16 bits 0100000000100010
d1 = 10 ----- los ultimos 16 bits 0100000000100100

Lo que pasa es que la posición por donde empieza el numero binario por la derecha, no es la misma en todos los números. Sin saber donde empieza el numero por la derecha, no se puede saber que numero es. Hace falta esa información además del numero. La variable double debe tener mas datos de información de su valor. ¿Donde estan?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de MAFUS

Leer de la memoria RAM

Publicado por MAFUS (1 intervención) el 04/02/2017 00:47:13
Prueba el siguiente código. Muestra los bits del double desde el MSB al LSB en orden, independientemente del endianness de la máquina.

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
void double_bitshow(double d) {
    for(int i = sizeof(double)*8 - 1; i >= 0; --i)
        printf("%i", (int)(*(size_t *)&d >> i) & 1);
}
 
int main() {
    double d = -1;
 
    double_bitshow(d);
}

Supongo que no te supondrá mucha dificultad el modificar el código y acceder a los bytes, pero cuidado de dar un mal formato al double.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Leer de la memoria RAM

Publicado por Capitan Kirk (48 intervenciones) el 16/02/2017 09:41:51
Si quieres conocer el formato en memoria de las variables de tipo real (float o double), mírate la norma IEEE 754.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar