Есть некий код, который записывает данные в память.
Допустим, ему передали указатель на начало блока памяти, - void *, - и числовое значения для записи - data. Указатель преобразуется в тип int, и записывается разность data - val.
void write(void *addr, int data = 1024) {
*((int*) addr) = data - 18;
}
Для проверки корректности функционирования программы, копирую каждый байт блока памяти в файл, а после изучаю его.
for (std::size_t i = 0; i < size; i++)
fout << std::hex << ((int) *((char*) addr + i));
Особенность в том, что, например, результат выражения 1024 - 18 выглядит в файле так: ffffffee, 3, 0, 0, а должно: ee, 3, 0, 0.
Почему возникает эта странность? Как байт может хранить такое большое число?
Вы преобразуете байт в int:
(int) *((char*) addr + i)
Соответственно, cout выводит знаковое значение типа int, получая его из ee. У вас имеется значение 238, которое - в знаковом представлении байта - отрицательное (знаковый бит равен 1). Вот этот бит знака и распространяется при преобразовании в int.
Попробуйте
fout << hex << setw(2) << setfill('0') << (unsigned int)(*((unsigned char*) addr + i));
Не нужно приводить к int, приводите к unsigned char
Сборка персонального компьютера от Artline: умный выбор для современных пользователей