Есть некий код, который записывает данные в память.
Допустим, ему передали указатель на начало блока памяти, - 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Для того чтобы понять что сессия заблокирована (CTRL+ALT+DEL -> Lock) используется следующий кусок кода:
Помогите пожалуйста! Какое условие нужно задать чтобы при клике на следующую карточку предыдущая закрывалась?
Пишу таблицы для своего приложение с помощью сайта быстрого перевода текста в HTML текст отображается без ошибок но вот на месте таблички стоит...
Может баян, но не нашёл для jspЕсть выпадающий список select, есть input type='number' и кнопка type='submit'