Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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 байта), как целую часть.Но это только догадки...можно потверждение либо опровержение теории и подробное описание процесса и построения....
Заранее благодарен

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 11.02.06 14:23
не оно не верно это точно :) Дай лучше на код взглянуть :)

Ответить

Номер ответа: 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 гораздо удобнее.

Ответить

Номер ответа: 5
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 11.02.06 16:06
я бы вообще лучше оставил все как есть :) просто High часть домножил бы на 2^32 и прибавил бы Low part... все это пихнуть в Double... Правда все равно возможен overflow :) Ну да что делать, QWORD'а нет :(

Ответить

Номер ответа: 6
Автор ответа:
 vb_lord



Вопросов: 7
Ответов: 45
 Профиль | | #6 Добавлено: 12.02.06 14:05
В MSDN microsoft пример исползования Currency для целочисленной 8 байтной API функции. Был похожий вопрос вопрос с объемом винчестера(он в 4 байта не влезает :))

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам