Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.075 c
15-1263679001
Кто б сомневался
2010-01-17 00:56
2010.08.27
Закон об авторском праве


15-1273005004
Юрий
2010-05-05 00:30
2010.08.27
С днем рождения ! 5 мая 2010 среда


2-1271921806
Эренка
2010-04-22 11:36
2010.08.27
Ошибка деления на ноль, комплексные функции


2-1268239219
Eugen1501
2010-03-10 19:40
2010.08.27
TIdMultipartFormDataStream;


2-1271096917
d@nger
2010-04-12 22:28
2010.08.27
DBGridEh и DropDownBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский