Страница: 1 |
|
Вопрос: Переменная типа Currency аля тип LARGE_INTEGER
|
Добавлено: 11.02.06 13:57
|
|
Автор вопроса: ENIX | ICQ: 238819245
|
Возник вопрос при использовании АПИшки GlobalMemoryStatusEx. То что там используется тип LARGE_INTEGER - это вроде понятно. Потому что тип Long 32 - битный (4 байтовый), а этого не хватает для нынешних обьемах оперативки, поэтому мы делим значение обьема по 4 и лепим их в LARGE_INTEGER. А вопрос почему потом используется переменная типа Currency, в которую через АПИшку CopyMemory передаем значение. Насколько я помню - эта переменная используется для хранения денежных величин, а она значит состоит тоже из старших(до запятой) и младших(после) бит...мы ей передаем LARGE_INTEGER..она воспринимает Лоу(4 байта) часть как веществ. значение, а Хай (4 байта), как целую часть.Но это только догадки...можно потверждение либо опровержение теории и подробное описание процесса и построения....
Заранее благодарен
Ответить
|
Номер ответа: 2 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #2
|
Добавлено: 11.02.06 14:40
|
Это в твоем представлении Currency делится на вещественную и целую.
На деле это сплошные 8 байт. И их можно рассматривать как угодно: как 1+7 байт, как 4+4 байта, как High+Low, как Double, как Currency
Ответить
|
Номер ответа: 3 Автор ответа: ENIX
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 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #4
|
Добавлено: 11.02.06 15:23
|
Судя по коду, копируется в Currency из соображений удобства дальнейшего перевода в читабельный вид.
8 байтовых ведь в vb два типа: Double и Currency. Соответственно выбор: либо копировать в double и затем морочиться с экспонентами, мантиссами и т.д. либо копировать в переменную, свободную от этих заморочек и просто учесть положение запятой (Currency ведь без мантисс и т.п.) - тут Currency гораздо удобнее.
Ответить
|
Страница: 1 |
Поиск по форуму