Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

pointer to cardinal or to longint ? [D7, WinXP]


Страницы:   1 2

azatsh ©   (2010-02-12 00:40:00) 

Переменная типа ссылка вроде как беззнаковое число (адрес), а longint знаковое. Так можно ли хранить ссылку в longint? И еще вопрос... Сейчас есть ПК с оперативкой больше 4Гб. Каким образом адресуется память такого размера, если на переменную типа ссылка отводится только 4 байта?


Стенка   (2010-02-14 11:53:00) [1]

> Подробности в книгах по Ассемблеру для начинающих.

Похоже, кое-кто их не читал.


Anatoly Podgoretsky   (2010-02-14 11:20:00) [2]

Вычитание заменяется беззнаковым сложением по модулю 2 и установкой флагов, в том числе и знак числа.
Подробности в книгах по Ассемблеру для начинающих.


Стенка   (2010-02-14 10:04:00) [3]

> Для компа минуса как такового нет. (Если не считать одного флага процессора :)

с этого места по-подробнее :)


Германн   (2010-02-14 01:59:00) [4]


> Да, вы правы! Я почему то думал что приведение типов может
> исказить данные. Как например при

Всему виной, имхо, наша человеческая предрасположенность к десятичной форме представления чисел. А комп работает в двоичной. Это для нас важно есть минус перед числом или его нет. А компу пофигу. Для компа минуса как такового нет. (Если не считать одного флага процессора :).


ProgRAMmer Dimonych   (2010-02-14 01:54:00) [5]

> [28] azatsh   (13.02.10 12:41)
> А где можно про это почитать?

У Рихтера неплохо расписано. Главное - если что-то сразу в голове не укладывается, отложить на попозже, ибо после прочтения время от времени просветление наступает. Многократно и неожиданно :)


Демо   (2010-02-13 13:48:00) [6]


> azatsh   (13.02.10 12:41) [28]


Всё верно. При приведении типов одинаковой размерности значение переменных не теряется.


azatsh   (2010-02-13 12:41:00) [7]


> А почитать? Про виртуальную память.

А где можно про это почитать?
> Но в целом это чушь, связанная с не пониманием сути "преобразования
> типов".

Да, вы правы! Я почему то думал что приведение типов может исказить данные. Как например при
var
 w: word;
 i: integer;
begin
 i:=65537;
 w:=word(i); // он возьмет число по модулю 65536
end;
...............

А тут tag:=longint(p) действительно все хорошо :)


Anatoly Podgoretsky   (2010-02-13 12:03:00) [8]

> Германн  (13.02.2010 03:00:23)  [23]

А его и нет, тут простое приведение.


12   (2010-02-13 10:10:00) [9]

как-то так

 public      { Public declarations }
    Procedure Change(Sender:tObject);
 end;

var
 Form1: TForm1;
 m:array[0..3] of integer;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  x:integer;
  i:integer;
begin
 x:=1;
 for I := 0 to 3 do
   if m[i]<>0 then x:=x*m[i];
 ShowMessage(inttostr(x));
end;

procedure TForm1.Change(Sender: tObject);
begin
 Pinteger(tEdit(Sender).Tag)^:=strtoint(tEdit(Sender).Text);
 showmessage('');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
e:tedit;
i:integer;
begin
for i := 0 to 3 do
begin
  m[i]:=random(10);
  e:=tEdit.Create(form1);
  e.Parent:=form1;
  e.top:=i*30;
  e.Name:='Edit'+inttostr(i);
  e.Text:=inttostr(m[i]);
  e.Tag:=LongInt(@m[i]);
  e.Visible:=true;
  e.OnChange:=Change;
end;
end;


Германн   (2010-02-13 03:24:00) [10]


>
> > Про адресацию оперативки я так и не услышал толкого ответа.
>
> >  В 4 байта помещается 4294967296 значений, т.е. я могу
> адресовать
> > при помощи переменной типа pointer примерно 4Гб. Как будет
> > адресоваться остальная память, если всего оперативки ну
> > скажем 8Гб?
>
>
> ты не заплатил за толковый ответ
>

Имхо, не хватит у него денег заплатить за "толковый ответ".


Германн   (2010-02-13 03:24:00) [11]


>
> > Про адресацию оперативки я так и не услышал толкого ответа.
>
> >  В 4 байта помещается 4294967296 значений, т.е. я могу
> адресовать
> > при помощи переменной типа pointer примерно 4Гб. Как будет
> > адресоваться остальная память, если всего оперативки ну
> > скажем 8Гб?
>
>
> ты не заплатил за толковый ответ
>

Имхо, не хватит у него денег заплатить за "толковый ответ".


Германн   (2010-02-13 03:00:00) [12]


> azatsh   (12.02.10 19:21) [19]
>
>
> > у всех компонентов есть tag, туда удобно бывает сунуть
>
>
> Вот именно! Я так и хочу делать. Пишу tag:=longint(p)

Но в целом это чушь, связанная с не пониманием сути "преобразования типов".


Германн   (2010-02-13 02:16:00) [13]


> azatsh   (12.02.10 19:21) [19]
>
>
> > у всех компонентов есть tag, туда удобно бывает сунуть
>
>
> Вот именно! Я так и хочу делать. Пишу tag:=longint(p), вроде
> работает..

А почему бы не работать? Tag типа Integer, т.е. 4 байта. Longint тоже 4 байта. И много есть еще типов размером 4 байта. И каждый из них подойдет для записи значения в свойство Tag.

> Смогу ли я получить тот же адрес при обратном преобразовании

Безусловно. Поскольку никакого преобразования данныхв твоих действиях нет. Есть только указания компилятору, чтобы он не беспокоился.


Стенка   (2010-02-12 23:55:00) [14]

> azatsh   (12.02.10 19:21) [19]
> ... значение переменной p больше чем 2147483648...

Считай, что есть только значения битов, на которые ты имеешь возможность смотреть как на целое или адрес, в зависимости от потребности. Так тебе будет проще.

> Смогу ли я получить тот же адрес при обратном преобразовании

Каком преобразовании? Где тут преобразование?
Если снова посмотреть на те же биты как на адрес, то он естественно будет тем же, биты-то никто не менял.

> Про адресацию оперативки я так и не услышал толкого ответа.

А почитать? Про виртуальную память.


Игорь Шевченко   (2010-02-12 19:27:00) [15]


> допустим значение переменной p больше чем 2147483648


Это фантастика


> Про адресацию оперативки я так и не услышал толкого ответа.
>  В 4 байта помещается 4294967296 значений, т.е. я могу адресовать
> при помощи переменной типа pointer примерно 4Гб. Как будет
> адресоваться остальная память, если всего оперативки ну
> скажем 8Гб?


ты не заплатил за толковый ответ


azatsh   (2010-02-12 19:21:00) [16]


> у всех компонентов есть tag, туда удобно бывает сунуть


Вот именно! Я так и хочу делать. Пишу tag:=longint(p), вроде работает..
Так вот уточню свой вопрос: допустим значение переменной p больше чем 2147483648, тогда что будет после longint(p) ? Смогу ли я получить тот же адрес при обратном преобразовании (p:=pointer(tag)) ?

Про адресацию оперативки я так и не услышал толкого ответа. В 4 байта помещается 4294967296 значений, т.е. я могу адресовать при помощи переменной типа pointer примерно 4Гб. Как будет адресоваться остальная память, если всего оперативки ну скажем 8Гб?


Anatoly Podgoretsky   (2010-02-12 16:01:00) [17]

> han_malign  (12.02.2010 14:14:14)  [14]

А почему не DataCenter?


Anatoly Podgoretsky   (2010-02-12 16:00:00) [18]

> han_malign  (12.02.2010 12:47:12)  [12]

Откуда дровишки?


Игорь Шевченко   (2010-02-12 14:50:00) [19]


> уже i386 умел адресовать 64 ТБ виртуальной памяти через
> страничное преобразование


Немножко не так, в описаниях обычно стыдливо пишут "до 64 терабайт", потому что необходимость наличия гиперпространства (где резидентные таблицы страниц) предел адресации несколько уменьшает.

Где-то была замечательная статья на этот счет, что как ни старайся, обещанного объема виртуальной памяти адресовать не получится.


KilkennyCat   (2010-02-12 14:27:00) [20]

Да, очень хороший и удачный пример.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо