Тип Int

Тема в разделе "C и С++ FAQ", создана пользователем Yalud, 24 янв 2007.

Статус темы:
Закрыта.
  1. Yalud

    Yalud Гость

    Поясните пожалуйста каков формат отображения переменной типа int в физической памяти. Как ни пародоксально ответ на данный вопрос я не нашел ни в одной книге c++, может я книги какие-то не те читаю :). Наверное в каждой средней школе первый урок информатики начинается с объяснения подобных вопросов. Сразу прошу прощения за свой ниский уровень элементарных знаний.

    Все мы знаем, что переменная типа int имеет размер 4 байта. Тогда в оперативной памяти наблюдается следующая картина:

    адрес значение
    00000000 xx (xx- число в шеснадцетиричном коде)
    00000001 xx
    00000002 xx
    00000003 xx

    Как будут выглядеть эти ячейки памяти, если переменная типа int содержит число -1467324121 (к примеру). Или объясните общий принцип.
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Yalud+24:01:2007, 12:00 -->
    <span class="vbquote">(Yalud @ 24:01:2007, 12:00 )</span><!--QuoteEBegin-->Поясните пожалуйста каков формат отображения переменной типа int в физической памяти. Как ни пародоксально ответ на данный вопрос я не нашел ни в одной книге c++,
    [snapback]53929" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Странно было бы если бы нашел :)
    Смотри сюда
     
  3. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Полагаю, он не об этом спрашивал. В книгах по С этого нет, потому что способ хранения зависит от платформы, а не от языка.
    http://ru.wikipedia.org/wiki/Big-endian
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: grigsoft

    <!--QuoteBegin-Yalud+24:01:2007, 12:00 -->
    <span class="vbquote">(Yalud @ 24:01:2007, 12:00 )</span><!--QuoteEBegin-->Как будут выглядеть эти ячейки памяти, если переменная типа int содержит число -1467324121 (к примеру).
    [snapback]53929" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Сначала надо переменную перевести в 16-ричный (ну или двоичный вид), а только потом разбираться с порядком байт. И еще у меня сложилось впечатление, что 16-ричное значение получено из отладчика, а он, как раз таки, байты в нужном порядке ставит
     
  5. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    Я не знаю.
     
  6. Yalud

    Yalud Гость

    Спасибо за участие, я посмотрел все прилагаемые материалы. Согласен с мнением, что для начала необходимо перевести число в 16-ричный вид, но думаю, что байты полученного шеснадцетеричного числа и байты находящиеся в памяти будут различными не только по порядку размещения, а именно по значению. Дело в том, что существует какое-то правило, которое определяет как именно должны отображаться положительные и отрицательные числа в двоичном(сугубоположительном) коде. Насколько мне известно, какой-то из битов в формате числа int отвечает только за знак числа, при этом если число отрицательное все остальные биты инвертируются и вроде бы к полученному результату добавляется единица. Именно такое правило я и пытаюсь найти в точной его формулировке для 32х-разрядных процессоров(хотя наверное от разрядности проца этот формат не зависит). Сейчас капаюсь в HEX редакторе, если удасться получить результат опытным путем, ответ сообщу. :(
     
  7. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Ну так надо правильно выражаться :(
    википедия все равно рулит
     
  8. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Yalud+25:01:2007, 06:25 -->
    <span class="vbquote">(Yalud @ 25:01:2007, 06:25 )</span><!--QuoteEBegin-->Сейчас капаюсь в HEX редакторе, если удасться получить результат опытным путем, ответ сообщу
    [snapback]53990" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Получить правила перевода в дополнительный код при помощи HEX редактора - это конечно задача не для слабонервных :(
     
  9. Igorg

    Igorg Гость

    <!--QuoteBegin-European+25:01:2007, 10:39 -->
    <span class="vbquote">(European @ 25:01:2007, 10:39 )</span><!--QuoteEBegin-->Получить правила перевода в дополнительный код при помощи HEX редактора - это конечно задача не для слабонервных
    [snapback]54019" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Это точно. Облегчу задачу (сугубо для IA-32):
    int == Doubleword Signed Integer
    Sign
    |----|------------------------------|
    31-30--------------------------- 0
    В памяти хранится начиная с младшего байта (little endian). По смещению 0 хранятся биты 7-0, по смещению 1 биты 15-8 и далее (команды пересылки это учитывают и автоматически размещают быйты в регистрах как надо). Числа хранятся в дополнительном коде (two's complement) - но об этом на википедии хорошо написано, знаковый бит в любом случае очищен, если число положительно, и установлен -- если отрицательно. Добавлю только, что компу все равно, знаковое число или беззнаковое. Это решает программист и использует соответствующие команды процессора и алгоритмы (ну, или компилятор за него).
    Читай: http://www.intel.com/products/processor/manuals/, там все подробненько написано.
     
  10. -=

    -= Гость

    Ну эта переменная хранится в сегменте данных программы и её можно увидеть в дебаггере екзешника, где виден её адрес иданные, например:
    Код (Text):
    //программа
    void main()
    {
    int a=012345;
    }
    //дебаггер(сегмент данных)
    //адрес     HEX коды строки  Форматированное отображение
    DS:0015 30 31 32 33 34 35  012345
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей