@k-morozov

Как хранятся числа в памяти?

Пытаюсь разобраться как хранятся в памяти данные структуры:

#include <stdio.h> 
struct Data {
	short id;
	double val;
};

typedef struct Data Data;

int main() {
	Data myData = {50, 1.2};
	char *ptr = (char *)&myData;

	printf("size struct = %ld\n", sizeof(Data));
	printf("size int = %ld\n", sizeof(int));
	printf("size double = %ld\n", sizeof(double));
	
	printf("%p:\t", ptr);
	for(int i=0; i<sizeof(myData); ++i) {
		printf("%02x ", *(ptr+i) );
	}
	putchar('\n');
	return 0;
}

Получаю такой вывод:

size struct = 16
size int = 4
size double = 8
0x7ffc3eeb9930:	32 00 11 49 02 56 00 00 33 33 33 33 33 33 fffffff3 3f


я понимаю что 32 00 11 49 - это интовское значение - но как его расшифровать, что там 50? аналогично с double, Как в данном выводе понять где выравнивание происходит?
  • Вопрос задан
  • 189 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
struct Data {
  short id;
  double val;
};


я понимаю что 32 00 11 49 - это интовское значение

в этой структуре short int, 2 байта. 0x32 0x00 -- это оно (0x32 + 256 * 0x00 = 50), little endian.
0x11 0x49 -- это мусор. 0x02 0x56 0x00 0x00 идущие дальше -- это тоже мусор.
0x33 0x33 0x33 0x33 0x33 0x33 0xf3 0x3f -- это double (0x3ff -- порядок, 0x3333333333333 -- мантисса, значение = 0x1.3333333333333 * 2 ^ (0x3ff - 1023) = 1.19999999999999995559), little endian, ieee754.

Как в данном выводе понять где выравнивание происходит?

Можно воспользоваться макросом offsetof.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vanyamba-electronics
printf("Address of id: %08x\n", &(myData.id));
printf("Address of val: %08x\n", &(myData.val));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы