Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

pointer to cardinal or to longint ?   Найти похожие ветки 

 
azatsh   (2010-02-12 00:40) [0]

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


 
KilkennyCat ©   (2010-02-12 00:49) [1]

о 64-битных системах слышал?


 
Игорь Шевченко ©   (2010-02-12 01:00) [2]

для delphi это не актуально, ни первое, ни второе.


 
Германн ©   (2010-02-12 01:07) [3]

Первое вообще не понял зачем нужно?


 
KilkennyCat ©   (2010-02-12 01:19) [4]

Ну как же, вдруг минус случайно попадет.


 
0x00FF00   (2010-02-12 01:27) [5]

Насчёт больше 4 ГБ:
Когда-то, во времена учёбы в школе, была у меня машинка, не умевшая адресовать память выше первого мегабайта, и поэтому требовавшая для доступа к остальным восьми специальной приблуды под названием HIMEM.SYS...

По сабжу:
Ссылку хранить можно в любом четырёх++байтном типе, поддерживающем тайпкастинг в тип ссылки.


 
Игорь Шевченко ©   (2010-02-12 01:28) [6]

Когда (если) выйдет Delphi, генерирующая 64-битный код, настанет очередная "большая дупа". Как она настала, когда Char перестал быть умолчанию однобайтовым.


 
0x00FF00   (2010-02-12 01:30) [7]

> выйдет Delphi, генерирующая 64-битный код

Утопист Вы, Игорь, ох утопист...


 
KilkennyCat ©   (2010-02-12 01:37) [8]


> выйдет Delphi, генерирующая 64-битный код

а сейчас можно 2 раза по 32


 
Германн ©   (2010-02-12 01:44) [9]


> KilkennyCat ©   (12.02.10 01:19) [4]
>
> Ну как же, вдруг минус случайно попадет.
>

Не. Я про то зачем вообще нужно "pointer to cardinal or to longint"?
Зачем "хранить ссылку в longint"? Для ссылок в любой версии Дельфи есть тип pointer.


 
Anatoly Podgoretsky ©   (2010-02-12 08:57) [10]

> Игорь Шевченко  (12.02.2010 01:28:06)  [6]

Пессимист ты Игорь, на самом деле будет хуже


 
12 ©   (2010-02-12 10:18) [11]


> Я про то зачем вообще нужно "pointer to cardinal or to longint"?

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


 
han_malign   (2010-02-12 12:47) [12]


> о 64-битных системах слышал?

- уже i386 умел адресовать 64 ТБ виртуальной памяти через страничное преобразование; шина адреса: 386SX - 26-бит, 386DX - 32-бит.
- Pentium Pro - 36-битнная шина адреса - 64 ГБ адресуемой физической памяти.


 
KilkennyCat ©   (2010-02-12 13:03) [13]


> han_malign   (12.02.10 12:47) [12]

да, давай, расскажи о куче примочек, о PAE и фсякой прочей фигне, которая может сделать этот мир счастливым, полным добра, любви и милосердия.
Но прежде попробуй сам сие безглючно и просто настроить, и чтоб моя программа схавала более 2 гигов.


 
han_malign   (2010-02-12 14:14) [14]


> и чтоб моя программа схавала более 2 гигов.

32-битный Windows Server 2003 Enterprise Edition - 64ГБ лицензия...


 
KilkennyCat ©   (2010-02-12 14:27) [15]

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


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


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


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

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


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

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

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


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

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

А почему не DataCenter?


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


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


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

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


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


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


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


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


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


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

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

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

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

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

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

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


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


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

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

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

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


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


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

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


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


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

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


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


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

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


 
12 ©   (2010-02-13 10:10) [26]

как-то так

 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;


 
Anatoly Podgoretsky ©   (2010-02-13 12:03) [27]

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

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


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


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

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

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

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


 
Демо ©   (2010-02-13 13:48) [29]


> azatsh   (13.02.10 12:41) [28]


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


 
ProgRAMmer Dimonych ©   (2010-02-14 01:54) [30]

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

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


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


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

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


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

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

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


 
Anatoly Podgoretsky ©   (2010-02-14 11:20) [33]

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.045 c
15-1270388228
Дмитрий С
2010-04-04 17:37
2010.08.27
Как убрать веб браузер при загрузке delphi 2010.


3-1243244910
Ольга
2009-05-25 13:48
2010.08.27
Текст в окне Messages Query Analyzer


15-1266830326
Денис_
2010-02-22 12:18
2010.08.27
Подскажите книгу


2-1267715582
ZV
2010-03-04 18:13
2010.08.27
Инвертировать определенный бит в байте. Как ?


15-1270931403
Юрий
2010-04-11 00:30
2010.08.27
С днем рождения ! 11 апреля 2010 воскресенье