방법을 묻는 이 SO 질문 을 우연히 발견했습니다. 더 큰 16 진수 값을 양수 값으로 변환 :
?Val("&H8000") -32768 Val("&HFFFF") -1
내 대답은 문자열 숫자를 하나씩 반복하고 각각의 값을 결과로 계산하는 것이 었습니다.
Function ConvertHex(ByVal value As String) As Double If Left(value, 2) = "&H" Then value = Right(value, Len(value) - 2) End If Dim result As Double Dim i As Integer, j As Integer For i = Len(value) To 1 Step -1 Dim digit As String digit = Mid$(value, i, 1) result = result + (16 ^ j) * Val("&H" & digit) j = j + 1 Next ConvertHex = result End Function
작동하지만 가능합니다. ” 내가 “아주 단순해야하는 일에 대해 어리석게 지나치게 복잡한 일을했다고 생각하는 데 도움이됩니다.
더 나은 방법이 있지 않나요?
댓글
Answer
는 16 진수 리터럴입니다.
표현식을 변환 할 수있는 변환 함수의 수 가 있습니다. 원하는 유형으로 설정합니다.
원하는 유형에 따라 간단해야합니다.
Function ConvertHex(ByVal value As String) As Currency Dim result As Currency result = CCur(value) If result < 0 Then "Add two times Int32.MaxValue and another 2 for the overflow "Because the hex value is apparently parsed as a signed Int64/Int32 result = result + &H7FFFFFFF + &H7FFFFFFF + 2 End If ConvertHex = result End Function
통화 대 두 배
정확하게 표현할 수있는 최대 양의 정수 값 :
-
&H0020000000000000
(9,007,199,254,740,992) ( 더블 ( IEEE 754 binary64 ) -
&H000346DC5D638865
(922,337,203,685,477) : 통화
그렇다면 왜 Double
보다 Currency
를 사용하는 이유는 후자가 더 큰 범위의 정수에서 작동 할 때?
Currency
는 항상 정확합니다. Currency
값이 오버플로되면 오류가 발생합니다. double의 표현 가능한 최대 정수 값을 오버플로하면 대략적인 정수 값을 얻습니다.
Dim doubleMax As Double Dim doubleAfter As Double doubleMax = CDbl("&H0020000000000000") doubleAfter = doubleMax + 1 MsgBox "Double before: " & Format(doubleMax, "#") & vbNewLine & "after: " & Format(doubleAfter, "#") Dim currencyMax As Currency Dim currencyAfter As Currency currencyMax = CCur("&H000346DC5D638865") currencyAfter = currencyMax + 1 MsgBox "Currency before: " & Format(currencyMax, "#") & vbNewLine & "after: " & Format(currencyAfter, "#")
이 예제의 출력은 다음과 같습니다.
Double before: 9007199254740990 after: 9007199254740990
그런 다음 run-time error "6": Overflow
반올림 오류를 피하고 싶습니다. 이제 MSDN은 Double
가
IEEE 64 비트 (8 바이트) 부동 소수점 숫자로 저장되어 있다고 주장합니다.
하지만 “ IEEE 754 binary64 에 대한 내용을 읽었다면 예제의 출력에 약간 놀랐습니다. 실제 최대 값은 &H00038D7EA4C68000
(1,000,000,000,000,000)입니다.
댓글
- 굉장합니다. ' 내 SO 답변에 대한 수정에 대해이 답변에 연결했습니다. 🙂
- 대
Double
약간 흥미로운 것을 발견했습니다. -
doubleMax + doubleMax
가 오버플로 오류? - @Meehow 방금 테스트 한 결과 VBA의
Double
에서 오버플로가 발생하지만 ' 여전히 파싱 된 결과가 정수이면 오버플로 할 수 없습니다. ' ' 해당 언어로 작업 할 필요가 없습니다. - 이 작업을 수행하는 올바른 관용적 방법은 @Meehow가 OP에 대해 언급 한대로 내장 변환 함수 중 하나를 사용하는 것입니다. -나는 '이 함수를 작성하게 만든 brainfart가 무엇인지 모릅니다 …
Short
,Integer
여야합니다.Long
,UShort
,UInteger
,ULong
또는Decimal
.Cdbl("&HFFFF")
에 어떤 문제가 있습니까?CDbl
가 잘못되었다고 생각하는 이유에 대한 답변 업데이트를 참조하십시오.