방법을 묻는 이 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 

작동하지만 가능합니다. ” 내가 “아주 단순해야하는 일에 대해 어리석게 지나치게 복잡한 일을했다고 생각하는 데 도움이됩니다.

더 나은 방법이 있지 않나요?

댓글

  • ' 당신이 이루고 싶은 일이 혼란 스럽습니다. " Double "는 일반적으로 64 비트 부동 소수점 숫자를 의미합니다. 그러나 텍스트에 " 양수 값 "이 필요하다고 나와 있지만 예제는 서명 된 16 비트 정수 (일반적으로 " short "라고 함). 또한 16 진수 문자열로 정수만 표현할 수있는 것처럼 보이므로 반환 유형은 Short, Integer 여야합니다. Long, UShort, UInteger, ULong 또는 Decimal.
  • @ 200_success '는 매우 제한된 데이터 유형 . 서명되지 않은 유형 없음 …
  • 매트, ' Cdbl("&HFFFF")에 어떤 문제가 있습니까?
  • @Meehow는이 시나리오에서 CDbl가 잘못되었다고 생각하는 이유에 대한 답변 업데이트를 참조하십시오.
  • @Meehow 가 정확히 " 저는 ' 매우 단순한 일을 위해 어리석게 지나치게 복잡한 일을했습니다. ";-)

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 

통화 대 두 배

정확하게 표현할 수있는 최대 양의 정수 값 :

그렇다면 왜 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가 무엇인지 모릅니다 …

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다