![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Максимальное значение разности двух Pointer`ов.
LightRipple © (2008-06-01 16:57:00)Здравствуйте !
Может ли "в реальной жизни" разность двух Pointer`ов не уместиться в integer ?
(разность нам важна со знаком)
Суть в следующем: есть чужая структура с изменяемым размером.
Есть в ней "лишнее" поле ULONG. Вот туда я и хочу запихать эту разность :)
guav (2008-06-01 23:31:00) [1]$2C000000 вполне выделяемый при LARGEADDRESSAWARE адрес, при том что выделяемые адреса могут быть и меньше $00400000, в результате разница указателей может превысить Maxint. MAXDWORD конечно не превысит никак, т.к. каждый указатель из вычитаемых от 0 до MAXDWORD.
Игорь Шевченко (2008-06-01 23:22:00) [2]
> Если не считать некоторые тонкости, например PAE то это
> так.
Собственно, даже при PAE не превышает :)
Anatoly Podgoretsky (2008-06-01 23:18:00) [3]Если не считать некоторые тонкости, например PAE то это так.
Игорь Шевченко (2008-06-01 22:57:00) [4]
> // может не выполнится при переходе через MAXDWORD
Указатели не переходят через MAXDWORD, адресное пространство в Win32 не превышает 4 Гб :)
LightRipple (2008-06-01 18:42:00) [5]Уфф. Вроде, осознала :)
Спасибо всем большое !
guav (2008-06-01 18:12:00) [6]в C/C++ есть ptrdiff_t.
Насчёт уместится в Longint. Один характерный пример того, о чём говорит Sha.
T1, T2: DWORD;
T1 := GetTickCount();
..
T2 := GetTickCount();
if T1 <= T2 then // может не выполнится при переходе через MAXDWORD
if T2 - T1 >= 0 then // всегда выполнится (если конечно время выполнения ... не превысит половину MAXDWORD
, поэтому
if T2 - T1 < 5000 then // всегда проверит разница меньше 5 сек или нет, даже если T2 = MAXDWORD минус копейки
Anatoly Podgoretsky (2008-06-01 18:01:00) [7]> LightRipple (01.06.2008 17:43:19) [19]
Может, поскольку диапазон до 4 гб.
Советую все таки взглянуть справку по целым типам
Anatoly Podgoretsky (2008-06-01 17:57:00) [8]> Ум_ще (01.06.2008 17:39:16) [16]
Да беззнаковый, а как тебе нравится Cardinal не 32 бита, а 31? А такое было.
Anatoly Podgoretsky (2008-06-01 17:57:00) [9]> Ум_ще (01.06.2008 17:37:14) [14]
Потому что над Integer можно выполнять арифметические операции, а больше приводить не к чему, поскольку с Cardinal всегда были проблемы, Борланд долго не мог решить, что же это такое, а dWord этот вообще имел приведение к самым разным типам. Но для этого надо помнить историю, начиная с Д2 и по наши годы.
Anatoly Podgoretsky (2008-06-01 17:55:00) [10]> Ум_ще (01.06.2008 17:34:13) [13]
Pointer это предопределенный тип, а это было приведено для понимания, pointer эквивалентен Cardinal или DWord, равносилен беззнаковому целому.
Anatoly Podgoretsky (2008-06-01 17:51:00) [11]> LightRipple (01.06.2008 17:28:11) [11]
Дельфи нормально работает с указателями за 2 гб, иначе бы работа была просто не возможна, почти все системные библиотеки находятся там
Sha (2008-06-01 17:51:00) [12]> Ум_ще (01.06.08 17:42) [18]
> То, что Cardinal (DWord) - это "масло масляное".
Согласен, но это не мое
> Pointer в Delphi - знаковый тип
Чего?
LightRipple (2008-06-01 17:45:00) [13]> [12] Sha © (01.06.08 17:31)
> Поэтому если для 32-битовых чисел A=B-C, то всегда будет B=A+C.
> И для знаковых и для беззнаковх. Все нормально поместится.
> Только на переполнение и на знак не обращай внимания :)
Вот такое положение вещей мне очень понравилось :)
Sha (2008-06-01 17:45:00) [14]> LightRipple © (01.06.08 17:43) [19]
> Может ли DWord(DWord(pBuf) - DWord(pOldBuf)) оказаться больше MAXINT ?
Какая тебе разница? чем это плохо?
LightRipple (2008-06-01 17:43:00) [15]Наверное плохо сформулировала вопрос.
Попробую еще раз:
pBuf, pOldBuf: Pointer;
begin
....
pOldBuf := pBuf;
RallocMem(pBuf, 454);
Может ли DWord(DWord(pBuf) - DWord(pOldBuf)) оказаться больше MAXINT ?
Ум_ще (2008-06-01 17:42:00) [16]То, что Cardinal (DWord) - это "масло масляное".
Pointer в Delphi - знаковый тип.
Sha (2008-06-01 17:41:00) [17]Ну и что?
Ум_ще (2008-06-01 17:39:00) [18]
> Sha © (01.06.08 17:38) [15]
> Потому, что по барабану, см [12]
Я то согласен. только Cardinal - беззнаковый тип. см. [10]
Sha (2008-06-01 17:38:00) [19]Потому, что по барабану, см [12]
Ум_ще (2008-06-01 17:37:00) [20]Канту в примерах приводит Pointer к Integer. Но не описывает, почему.