Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Тип Int
Форум программистов > Системное программирование > C, С++ и С Builder > C и С++ FAQ
Yalud
Поясните пожалуйста каков формат отображения переменной типа int в физической памяти. Как ни пародоксально ответ на данный вопрос я не нашел ни в одной книге c++, может я книги какие-то не те читаю smile.gif. Наверное в каждой средней школе первый урок информатики начинается с объяснения подобных вопросов. Сразу прошу прощения за свой ниский уровень элементарных знаний.

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

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

Как будут выглядеть эти ячейки памяти, если переменная типа int содержит число -1467324121 (к примеру). Или объясните общий принцип.
European
Цитата(Yalud @ 24:01:2007, 12:00 )
Поясните пожалуйста каков формат отображения переменной типа int в физической памяти. Как ни пародоксально ответ на данный вопрос я не нашел ни в одной книге c++,
*

Странно было бы если бы нашел smile.gif
Смотри сюда
grigsoft
Полагаю, он не об этом спрашивал. В книгах по С этого нет, потому что способ хранения зависит от платформы, а не от языка.
http://ru.wikipedia.org/wiki/Big-endian
European
Для: grigsoft

Цитата(Yalud @ 24:01:2007, 12:00 )
Как будут выглядеть эти ячейки памяти, если переменная типа int содержит число -1467324121 (к примеру).
*

Сначала надо переменную перевести в 16-ричный (ну или двоичный вид), а только потом разбираться с порядком байт. И еще у меня сложилось впечатление, что 16-ричное значение получено из отладчика, а он, как раз таки, байты в нужном порядке ставит
Kmet
Цитата
Все мы знаем, что переменная типа int имеет размер 4 байта.

Я не знаю.
Yalud
Спасибо за участие, я посмотрел все прилагаемые материалы. Согласен с мнением, что для начала необходимо перевести число в 16-ричный вид, но думаю, что байты полученного шеснадцетеричного числа и байты находящиеся в памяти будут различными не только по порядку размещения, а именно по значению. Дело в том, что существует какое-то правило, которое определяет как именно должны отображаться положительные и отрицательные числа в двоичном(сугубоположительном) коде. Насколько мне известно, какой-то из битов в формате числа int отвечает только за знак числа, при этом если число отрицательное все остальные биты инвертируются и вроде бы к полученному результату добавляется единица. Именно такое правило я и пытаюсь найти в точной его формулировке для 32х-разрядных процессоров(хотя наверное от разрядности проца этот формат не зависит). Сейчас капаюсь в HEX редакторе, если удасться получить результат опытным путем, ответ сообщу. unsure.gif
grigsoft
Ну так надо правильно выражаться smile.gif
википедия все равно рулит
European
Цитата(Yalud @ 25:01:2007, 06:25 )
Сейчас капаюсь в HEX редакторе, если удасться получить результат опытным путем, ответ сообщу
*

Получить правила перевода в дополнительный код при помощи HEX редактора - это конечно задача не для слабонервных smile.gif
Igorg
Цитата(European @ 25:01:2007, 10:39 )
Получить правила перевода в дополнительный код при помощи HEX редактора - это конечно задача не для слабонервных
*

Это точно. Облегчу задачу (сугубо для 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/, там все подробненько написано.
-=ФИЛОСОФ=-
Ну эта переменная хранится в сегменте данных программы и её можно увидеть в дебаггере екзешника, где виден её адрес иданные, например:
Код
//программа
void main()
{
int a=012345;
}
//дебаггер(сегмент данных)
//адрес     HEX коды строки   Форматированное отображение
DS:0015    30 31 32 33 34 35   012345
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2008 IPS, Inc.