ID do artigo: 189323 - Última revisão: quinta-feira, 15 de julho de 2004 - Revisão: 3.4

Como converter entre números assinados e não assinados

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

Visual Basic for Applications suporta apenas números inteiros de 2 e 4-byte assinado, enquanto outros idiomas, como C, oferecem suporte a números inteiros assinados e não assinados. Este artigo fornece funções de conversão entre números inteiros de 4 bytes assinados e não assinados e entre números inteiros de 2 bytes assinados e não assinados.

Mais Informações

No VBA, os valores de intervalo de inteiro é de -32768 a +32767 e para Long valores de -2147483648 a 2147483647. Quando fazer API chama ou chamar uma DLL escrita em C, você pode ser solicitado para passar ou receber valores não assinados no intervalo de 0 a 4294967296 ou 0 a 65535. As funções de conversão fornecidas abaixo convertem um inteiro não assinado em um Long e também de um não assinado longo para um Double para fins de entrada e exibição ou outros cálculos.

As quatro funções são:
UnsignedToLong
LongToUnsigned
UnsignedToInteger
IntegerToUnsigned

UnsignedToLong

A função pega um Double que contém um valor no intervalo de um não assinados Long e retorna um Long que você pode passar para uma API que requer um não assinados Long.

LongToUnsigned

A função usa um unsigned longo de uma API e o converte para um duplo para fins de exibição ou aritmética.

UnsignedToInteger

A função usa um Long que contém um valor no intervalo de um inteiro não assinado e retorna um Integer que você pode passar para uma API que requer um inteiro não assinado.

IntegerToUnsigned

A função pega um inteiro não assinado do e API e converte para um Long para fins de exibição ou aritmética.
   Declare Function MyAPI Lib "xxx" (Value As Long) As Long
   Dim uResult As Long
   uResult = MyAPI(UnsignedToLong(3300000000))
   Debug.Print "Return Code: " & LongToUnsigned(uResult)
				
no exemplo acima, a API MyAPI aceita não assinado é um Long como um parâmetro e retorna sem uma assinatura de código Long como resultado. Porque somente o VBA entende assinados longos, os usos de instrução DECLARE assinado longos. O UnsignedToLong
function converts a number outside the range of signed Long (but within the
				
intervalo de um não assinados Long) em um longo para fins de chamar a API. A função LongToUnsigned executa a conversão oposta.

Sem essas funções, o argumento de entrada teria que foram especificados como um longo, neste caso-994967296 e o valor de retorno devem ter a ser exibido como um valor assinado, possivelmente também como um negativo número e não-intuitiva.

Exemplo passo a passo

  1. Crie um novo projeto do VBA.
  2. Adicione o seguinte código para um módulo:
          Option Explicit
    
          Private Const OFFSET_4 = 4294967296#
          Private Const MAXINT_4 = 2147483647
          Private Const OFFSET_2 = 65536
          Private Const MAXINT_2 = 32767
    
          Function UnsignedToLong(Value As Double) As Long
            If Value < 0 Or Value >= OFFSET_4 Then Error 6 ' Overflow
            If Value <= MAXINT_4 Then
              UnsignedToLong = Value
            Else
              UnsignedToLong = Value - OFFSET_4
            End If
          End Function
    
          Function LongToUnsigned(Value As Long) As Double
            If Value < 0 Then
              LongToUnsigned = Value + OFFSET_4
            Else
              LongToUnsigned = Value
            End If
          End Function
    
          Function UnsignedToInteger(Value As Long) As Integer
            If Value < 0 Or Value >= OFFSET_2 Then Error 6 ' Overflow
            If Value <= MAXINT_2 Then
              UnsignedToInteger = Value
            Else
              UnsignedToInteger = Value - OFFSET_2
            End If
          End Function
    
          Function IntegerToUnsigned(Value As Integer) As Long
            If Value < 0 Then
              IntegerToUnsigned = Value + OFFSET_2
            Else
              IntegerToUnsigned = Value
            End If
          End Function
    						
  3. Somente para o Visual Basic: executar o projeto e pausá-lo.
  4. Digite o seguinte na janela Immediate/Debug:
          ?UnsignedToLong(3300000000)
          ?LongToUnsigned(-55)
          ?UnsignedToInteger(45000)
          ?IntegerToUnsigned(-3000)
  5. Você obterá os seguintes resultados:
    -994967296
    4294967241
    -20536
    62536

Referências

Para obter informações adicionais, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
112673  (http://support.microsoft.com/kb/112673/EN-US/ ) Como para passar e retornar unsigned números inteiros para DLLs do VB

A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic for Applications 5.0
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 de 32 Bits Enterprise Edition
  • Microsoft Access 95 Standard Edition
  • Microsoft Access 97 Standard Edition
Palavras-chave: 
kbmt kbhowto KB189323 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 189323  (http://support.microsoft.com/kb/189323/en-us/ )