Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];
ВнизМаксимальное значение разности двух 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.038 c