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

Вниз

Максимальное значение разности двух Pointer`ов.   Найти похожие ветки 

 
LightRipple ©   (2008-06-01 16:57) [0]

Здравствуйте !
Может ли "в реальной жизни" разность двух Pointer`ов не уместиться в integer ?
(разность нам важна со знаком)
Суть в следующем: есть чужая структура с изменяемым размером.
Есть в ней "лишнее" поле ULONG. Вот туда я и хочу запихать эту разность :)


 
Amoeba ©   (2008-06-01 17:02) [1]


> разность двух Pointer`ов

А на кой она нужна?


 
SergeyIT   (2008-06-01 17:05) [2]


> Может ли "в реальной жизни" разность двух Pointer`ов не уместиться в integer ?

Да. ULONG <> integer.


 
LightRipple ©   (2008-06-01 17:10) [3]

>  [1] Amoeba ©   (01.06.08 17:02)
> А на кой она нужна?

Бывает полезна, когда мы не хотим каждый раз вызывать функцию
для получения адреса, а хотим иметь готовый указатель :)


 
LightRipple ©   (2008-06-01 17:12) [4]

>  [2] SergeyIT   (01.06.08 17:05)
> Да. ULONG <> integer.

Это я знаю. Потому и спросила: "в реальной жизни".


 
Ум_ще   (2008-06-01 17:13) [5]


> двух Pointer`ов не уместиться в integer ?


Каким образом?
Абсолютное значение (Long)-(Long) не может быть более Abs(Int)


 
LightRipple ©   (2008-06-01 17:23) [6]

> [5] Ум_ще   (01.06.08 17:13)

Т.е. DWord(Pointer) не может быть больше MAXINT. Так ?


 
Ум_ще   (2008-06-01 17:23) [7]


> Т.е. DWord(Pointer) не может быть больше MAXINT. Так ?


Не так.
Разность не может быть больше.


 
Ум_ще   (2008-06-01 17:25) [8]

+вспомни, что Delphi не может работать с указателями,превышающими 2Гб памяти


 
Anatoly Podgoretsky ©   (2008-06-01 17:26) [9]

> LightRipple  (01.06.2008 16:57:00)  [0]

Не может 4 gb(23bit) - 0 = 4 gb, аналогично для 64 бит


 
Anatoly Podgoretsky ©   (2008-06-01 17:27) [10]

> LightRipple  (01.06.2008 17:23:06)  [6]

Pointer это не Integer, а Cardinal (DWord)


 
LightRipple ©   (2008-06-01 17:28) [11]

> [8] Ум_ще   (01.06.08 17:25)
> +вспомни, что Delphi не может работать с указателями,превышающими 2Гб памяти

А "другие" умеют ?


 
Sha ©   (2008-06-01 17:31) [12]

> LightRipple ©   (01.06.08 16:57)  
> разность нам важна со знаком

Процессор для 32-битового сложения и вычитания использует
одни и те же команды. Есть знак или нет знака - это только в
твоем воображении.

Поэтому если для 32-битовых чисел A=B-C, то всегда будет B=A+C.
И для знаковых и для беззнаковх. Все нормально поместится.
Только на переполнение и на знак не обращай внимания :)


 
Ум_ще   (2008-06-01 17:34) [13]


> Anatoly Podgoretsky ©   (01.06.08 17:27) [10]
> > LightRipple  (01.06.2008 17:23:06)  [6]Pointer это не
> Integer, а Cardinal (DWord)


Анатолий, в каком модуле это определение?


 
Ум_ще   (2008-06-01 17:37) [14]

Канту в примерах приводит Pointer к Integer. Но не описывает, почему.


 
Sha ©   (2008-06-01 17:38) [15]

Потому, что по барабану, см [12]


 
Ум_ще   (2008-06-01 17:39) [16]


> Sha ©   (01.06.08 17:38) [15]
> Потому, что по барабану, см [12]


Я то согласен. только Cardinal - беззнаковый тип. см. [10]


 
Sha ©   (2008-06-01 17:41) [17]

Ну и что?


 
Ум_ще   (2008-06-01 17:42) [18]

То, что Cardinal (DWord) - это "масло масляное".
Pointer в Delphi - знаковый тип.


 
LightRipple ©   (2008-06-01 17:43) [19]

Наверное плохо сформулировала вопрос.
Попробую еще раз:

pBuf, pOldBuf: Pointer;
begin
....
pOldBuf := pBuf;
RallocMem(pBuf, 454);
Может ли DWord(DWord(pBuf) - DWord(pOldBuf)) оказаться больше MAXINT ?


 
Sha ©   (2008-06-01 17:45) [20]

> LightRipple ©   (01.06.08 17:43) [19]
> Может ли DWord(DWord(pBuf) - DWord(pOldBuf)) оказаться больше MAXINT ?

Какая тебе разница? чем это плохо?


 
LightRipple ©   (2008-06-01 17:45) [21]

> [12] Sha ©   (01.06.08 17:31)
> Поэтому если для 32-битовых чисел A=B-C, то всегда будет B=A+C.
> И для знаковых и для беззнаковх. Все нормально поместится.
> Только на переполнение и на знак не обращай внимания :)

Вот такое положение вещей мне очень понравилось :)


 
Sha ©   (2008-06-01 17:51) [22]

> Ум_ще   (01.06.08 17:42) [18]
> То, что Cardinal (DWord) - это "масло масляное".

Согласен, но это не мое

> Pointer в Delphi - знаковый тип

Чего?


 
Anatoly Podgoretsky ©   (2008-06-01 17:51) [23]

> LightRipple  (01.06.2008 17:28:11)  [11]

Дельфи нормально работает с указателями за 2 гб, иначе бы работа была просто не возможна, почти все системные библиотеки находятся там


 
Anatoly Podgoretsky ©   (2008-06-01 17:55) [24]

> Ум_ще  (01.06.2008 17:34:13)  [13]

Pointer это предопределенный тип, а это было приведено для понимания, pointer эквивалентен Cardinal или DWord, равносилен беззнаковому целому.


 
Anatoly Podgoretsky ©   (2008-06-01 17:57) [25]

> Ум_ще  (01.06.2008 17:37:14)  [14]

Потому что над Integer можно выполнять арифметические операции, а больше приводить не к чему, поскольку с Cardinal всегда были проблемы, Борланд долго не мог решить, что же это такое, а dWord этот вообще имел приведение к самым разным типам. Но для этого надо помнить историю, начиная с Д2 и по наши годы.


 
Anatoly Podgoretsky ©   (2008-06-01 17:57) [26]

> Ум_ще  (01.06.2008 17:39:16)  [16]

Да беззнаковый, а как тебе нравится Cardinal не 32 бита, а 31? А такое было.


 
Anatoly Podgoretsky ©   (2008-06-01 18:01) [27]

> LightRipple  (01.06.2008 17:43:19)  [19]

Может, поскольку диапазон до 4 гб.
Советую все таки взглянуть справку по целым типам


 
guav ©   (2008-06-01 18:12) [28]

в 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 минус копейки


 
LightRipple ©   (2008-06-01 18:42) [29]

Уфф. Вроде, осознала :)
Спасибо всем большое !


 
Игорь Шевченко ©   (2008-06-01 22:57) [30]


> // может не выполнится при переходе через MAXDWORD


Указатели не переходят через MAXDWORD, адресное пространство в Win32 не превышает 4 Гб :)


 
Anatoly Podgoretsky ©   (2008-06-01 23:18) [31]

Если не считать некоторые тонкости, например PAE то это так.


 
Игорь Шевченко ©   (2008-06-01 23:22) [32]


> Если не считать некоторые тонкости, например PAE то это
> так.


Собственно, даже при PAE не превышает :)


 
guav ©   (2008-06-01 23:31) [33]

$2C000000 вполне выделяемый при LARGEADDRESSAWARE адрес, при том что выделяемые адреса могут быть и меньше $00400000, в результате разница указателей может превысить Maxint. MAXDWORD конечно не превысит никак, т.к. каждый указатель из вычитаемых от 0 до MAXDWORD.



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

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

Наверх




Память: 0.54 MB
Время: 0.024 c
2-1212160292
programmer90
2008-05-30 19:11
2008.06.29
Количество оперативной памяти в системе.


15-1211205462
Ломброзо
2008-05-19 17:57
2008.06.29
Как крякнуть IE


2-1212564137
Trei
2008-06-04 11:22
2008.06.29
Ссылка


15-1210773374
homm
2008-05-14 17:56
2008.06.29
Вопрос по overlapped - файлам


3-1201096350
Gklbery
2008-01-23 16:52
2008.06.29
динамический use