Страница: 1 |
Вопрос: Переменная типа Currency аля тип LARGE_INTEGER | Добавлено: 11.02.06 13:57 |
Автор вопроса: ![]() |
Возник вопрос при использовании АПИшки GlobalMemoryStatusEx. То что там используется тип LARGE_INTEGER - это вроде понятно. Потому что тип Long 32 - битный (4 байтовый), а этого не хватает для нынешних обьемах оперативки, поэтому мы делим значение обьема по 4 и лепим их в LARGE_INTEGER. А вопрос почему потом используется переменная типа Currency, в которую через АПИшку CopyMemory передаем значение. Насколько я помню - эта переменная используется для хранения денежных величин, а она значит состоит тоже из старших(до запятой) и младших(после) бит...мы ей передаем LARGE_INTEGER..она воспринимает Лоу(4 байта) часть как веществ. значение, а Хай (4 байта), как целую часть.Но это только догадки...можно потверждение либо опровержение теории и подробное описание процесса и построения....
Заранее благодарен |
Ответы | Всего ответов: 6 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 11.02.06 14:23 |
не оно не верно это точно ![]() ![]() |
Номер ответа: 2 Автор ответа: ![]() ![]() Вопросов: 0 Ответов: 1066 |
Профиль | Цитата | #2 | Добавлено: 11.02.06 14:40 |
Это в твоем представлении Currency делится на вещественную и целую.
На деле это сплошные 8 байт. И их можно рассматривать как угодно: как 1+7 байт, как 4+4 байта, как High+Low, как Double, как Currency |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 238819245 Вопросов: 9 Ответов: 76 |
Профиль | Цитата | #3 | Добавлено: 11.02.06 15:04 |
for sne:
Private Type LARGE_INTEGER lowpart As Long highpart As Long End Type Private Type MEMORYSTATUSEX dwLength As Long dwMemoryLoad As Long ullTotalPhys As LARGE_INTEGER ullAvailPhys As LARGE_INTEGER ullTotalPageFile As LARGE_INTEGER ullAvailPageFile As LARGE_INTEGER ullTotalVirtual As LARGE_INTEGER ullAvailVirtual As LARGE_INTEGER ullAvailExtendedVirtual As LARGE_INTEGER End Type Private Declare Function GlobalMemoryStatusEx Lib "kernel32.dll" (ByRef lpBuffer As MEMORYSTATUSEX) As Long Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long) ......... Dim memS As MEMORYSTATUSEX Dim lpBuf As Currency memS.dwLength = Len(memS) GlobalMemoryStatusEx memS 'TotalPhys CopyMemory lpBuf, memS.ullTotalPhys, LenB(memS.ullTotalPhys) gValue = CStr((lpBuf * 10000) / 1024 ^ 2) 'return gValue 2HOOLIGAN Не спорю, но почему при передачи через CopyMemory и подальшого вывода переменной Currency именно правые 4 разряда считаются вещественными несмотря на, что передавалось ей число большое и целое. Понятно, что нету физического разделения этой переменной на две части, просто в двоичной структуре идет разделение, например справа 5 разряд идет уже целое, а до этого веществ. часть(т.е. положение запятой)....но это токо догадки. Поэтому я просил либо подробно рассказать либо дать ссылочки на сатьи. |
Номер ответа: 4 Автор ответа: ![]() ![]() Вопросов: 0 Ответов: 1066 |
Профиль | Цитата | #4 | Добавлено: 11.02.06 15:23 |
Судя по коду, копируется в Currency из соображений удобства дальнейшего перевода в читабельный вид.
8 байтовых ведь в vb два типа: Double и Currency. Соответственно выбор: либо копировать в double и затем морочиться с экспонентами, мантиссами и т.д. либо копировать в переменную, свободную от этих заморочек и просто учесть положение запятой (Currency ведь без мантисс и т.п.) - тут Currency гораздо удобнее. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 11.02.06 16:06 |
я бы вообще лучше оставил все как есть ![]() ![]() ![]() |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 7 Ответов: 45 |
Профиль | Цитата | #6 | Добавлено: 12.02.06 14:05 |
В MSDN microsoft пример исползования Currency для целочисленной 8 байтной API функции. Был похожий вопрос вопрос с объемом винчестера(он в 4 байта не влезает ![]() |
Страница: 1 |
|