Форум: "Начинающим";
Текущий архив: 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