Hej, Då får du köra en loop. Hej, Då har du fel datatyp på din temporära variabel. Om du kan lagra data i nNumber så kan du lagra ett mindre värde i nTemp. Se till att dessa två är av samma datatyp. Tack, men jag valde en annan approach: Tjusigt! <b>>I ditt fal så kör du /16, men kan lika gärna köra AND 15 och sedan köra en bitskift. </b>Hex$ räcker inte till
Hex eller Hex$ är ju jättebra om man skall konvertera ett decimaltal till hex, men hur gör man om det inte räcker till?
Det verkar finnas ett tak på 0xFFFFFFFF. Över det blir det overflow.
/peterSv: Hex$ räcker inte till
Ta reda på vilket värde som max kan hanteras och gör så här:
1. Lagra ditt ursprungliga tal i en variabel; Ursprung
2. Skapa en tom strängvariabel; Resultat
3. I en temporär variabel, Temp, så lagrar du den numeriska svaret av Ursprung AND MaxVärdet
4. Nu lägger du över Hex$(Texp) i din Resultat. OBS! Lägg din nya konvertering FÖRST så att Resultat = Hex$(Temp) & Resultat
5. Dividera Ursprung med (MaxVärdet + 1) och släng bort decimaler, lagra nya värdet i Urpsrung
6. Om värdet är större än noll så upprepa från punkt 3
7. Klart
Lycka till!
// JohanSv:Hex$ räcker inte till
>> 3. I en temporär variabel, Temp, så lagrar du den numeriska svaret av Ursprung AND MaxVärdet
Det blir overflow på denna rad. Min implementation ser ut så här (samtliga variabler är doubles):
nTmp = nNumber And nMaxValue
/peterSv: Hex$ räcker inte till
// JohanSv:Hex$ räcker inte till
För den som är intresserad:
Public Function CDecToHex(nNumber As Double) As String
Dim sResult As String
Dim nQuotient As Double
Dim nReminder As Integer
nNumber = RemoveDecimals(nNumber)
While nNumber > 0
nQuotient = nNumber / 16
nQuotient = RemoveDecimals(nQuotient)
nReminder = nNumber - (nQuotient * 16)
sResult = Hex$(nReminder) & sResult
nNumber = nQuotient
Wend
CDecToHex = sResult
End Function
Anledningen till specialhanteringen kring nReminder är att Mod inte fungerar så bra på så stora tal.
/peterSv: Hex$ räcker inte till
En liten fundering, varför tar du i steg om 16? Jag antar för att du vill ha ett hex-tecken i taget. Men jag tror du får bättre prestanda om du kör med 32-bitars steg istället.
Och om du kör AND istälelt för division så får du också bättre prestanda. I ditt fal så kör du /16, men kan lika gärna köra AND 15 och sedan köra en bitskift.
// JohanSv:Hex$ räcker inte till
Fast är det double är det nog lite besvärligt... lämpligast i så fall är väl snarast att använda heltalsdivision - "\"