Задать вопрос
@OrdUs

Как узнать, хранятся числа в компьютере в прямом, дополнительном или обратном коде?

Я знаю, что в большинстве компьютеров они хранятся в дополнительном коде, но я хочу узнать, как это доказать с помощью программы. Как показать с помощью программы, что условное число int, равное -2, в компьютере хранится как 11111110?
  • Вопрос задан
  • 168 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Нетология
    Специалист по информационной безопасности + нейросети
    12 месяцев
    Далее
  • Компьютерная академия «TOP»
    Учебная программа “Разработка программного обеспечения”
    30 месяцев
    Далее
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Можно переинтерпретировать память как unsigned int, а там уже никакого дополнительного кода нет и 11111111111111111111111111111110 будет 4294967294, а 11111111111111111111111111111101 - 4294967293.
#include <iostream>
#include <cstring>
int main() {
  int x = -2;
  unsigned int y = 0;
  memcpy(&y, &x, sizeof(y));
  std::cout << y;
  return 0;
}

Еще можно делать извращение вроде std::cout << *(unsigned int*)(&x), но не стоит.
В случае обращения к int через указатель на unsigned int это еще нормально, но вообще говоря, это исключение. Обычно нельзя обращаться к переменной одного типа через указатель другого типа. Это неопределенное поведение. Таким вот образом посмотреть на расположение битов в float через преобразование к int нельзя.

Копирование же в переменную другого типа но такого же размера через memcpy - сработает всегда. При этом компилятор копирование убирает при оптимизации, так что правильное решение работат также быстро, как с Undefined Behavior.

Примерно также можно определить и порядок байт в числе, надо будет копировать в массив из байт и выводить уже побайтово.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
mindtester
@mindtester
http://iczin.su/hexagram_48
- документация по архитектуре процессора
- документация по языку программирования
- двоичный дамп памяти переменных разного типа

.. вопрос гуглимый, что не приветствуется здесь
Ответ написан
Комментировать
shurshur
@shurshur
Сисадмин, просто сисадмин...
Нынче достаточно сложно найти компилятор с однобайтовым int. Поэтому стоило бы явно использовать типы навроде int8_t.

Вот тривиальнейшая программа, которая берёт знаковый int8_t -2 и беззнаковый uint8_t по тому же адресу, затем печатает их оба. В общем-то, вполне наглядно.

#include <stdint.h>
#include <stdio.h>

int8_t x = -2;
uint8_t* y = &x;

int main() {
    printf ("x = %d\n", x);
    printf ("y = %d\n", *y);
}
Ответ написан
Комментировать
moderatorh
@moderatorh
В IT с 1987-го года.
Не, там не много не так.
Как хранятся числа в памяти компьютера зависит от конкретного компилятора или или интерпретатора языка, ну и типа числа само собой или типа переменной (числа иногда специально сохраняют и как сроки).
Если все храниться по умолчанию, то найти просто.
1. Если программа не большая, целиком дизасемблируете ее и смотрите.
2. Если большая да модульная, с библиотеками и т.д, то так сделать будет очень тяжело, придется искать онлайн. Нужен специальный софт. Какой он сейчас, я не знаю, реинжинерингом под x86/64 не занимался уже больше 20 лет, так что много воды утекло, софт изменился, но принципы остались точно.
Суть в том, что расставляются брекпоинты, ну например по потери жизни.
Или наоборот по началу новой жизни. Далее берется пару переменных, например число здоровья и снарядов или еще чего нибудь и в снипете памяти ищутся эти данные...
Дальше контролируете, что правильно наши еще парой попыток другими значениями.
Это классика. но очень многие игроделы, ну очень хитровы...(кованные) и под их нетрадиционную дупу потребуется еще какой хитрый болт подобрать. А все дело в том, что они не хранят данные так, как это предполагает язык по умолчанию, придумывают свои алгоритмы.
Если по началу в конце восьмидесятых на играх для спектрумов ограничивались ксором или подобными, затрудняющими жизнь алгоритмами, то уже к серине девяностых на пентиумах, начали извращаться по полной, кто во что горазд.
Вплоть до того, что наиболее хитросделанные вообще хранят не данные, а их хеши, да еще и с соллью!... ;-)

И все для того, что бы правильным пацанам, которые их хитрокод расковыривать будут, жизнь осложнить.
Ответ написан
@robomakerr
Распринтить переменную по байтам, через указатель или через union.
Ответ написан
Комментировать
kawabanga
@kawabanga
- документация по архитектуре процессора
- документация по языку программирования
- двоичный дамп памяти переменных разного типа

.. вопрос гуглимый, что не приветствуется здесь
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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