Тип Int

  • Автор темы Yalud
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Y

Yalud

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

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

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

Как будут выглядеть эти ячейки памяти, если переменная типа int содержит число -1467324121 (к примеру). Или объясните общий принцип.
 
04.09.2006
2 566
2
Минск
#2
<!--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]
Странно было бы если бы нашел :)
Смотри
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться
 
04.09.2006
2 566
2
Минск
#4
Для: 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-ричное значение получено из отладчика, а он, как раз таки, байты в нужном порядке ставит
 
Y

Yalud

Гость
#6
Спасибо за участие, я посмотрел все прилагаемые материалы. Согласен с мнением, что для начала необходимо перевести число в 16-ричный вид, но думаю, что байты полученного шеснадцетеричного числа и байты находящиеся в памяти будут различными не только по порядку размещения, а именно по значению. Дело в том, что существует какое-то правило, которое определяет как именно должны отображаться положительные и отрицательные числа в двоичном(сугубоположительном) коде. Насколько мне известно, какой-то из битов в формате числа int отвечает только за знак числа, при этом если число отрицательное все остальные биты инвертируются и вроде бы к полученному результату добавляется единица. Именно такое правило я и пытаюсь найти в точной его формулировке для 32х-разрядных процессоров(хотя наверное от разрядности проца этот формат не зависит). Сейчас капаюсь в HEX редакторе, если удасться получить результат опытным путем, ответ сообщу. :(
 
04.09.2006
2 566
2
Минск
#8
<!--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 редактора - это конечно задача не для слабонервных :(
 
I

Igorg

Гость
#9
<!--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
Ну эта переменная хранится в сегменте данных программы и её можно увидеть в дебаггере екзешника, где виден её адрес иданные, например:
Код:
//программа
void main()
{
int a=012345;
}
//дебаггер(сегмент данных)
//адрес	 HEX коды строки  Форматированное отображение
DS:0015	30 31 32 33 34 35  012345
 
Статус
Закрыто для дальнейших ответов.