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 | Reduzir tudo

Sumário

Visual Basic for Applications só suporta assinado 2 e 4 bytes números inteiros, enquanto outros idiomas, tais como C, suportam assinados e inteiros. Este artigo fornece funções de conversão entre assinados e números inteiros de 4 bytes e entre assinados e números inteiros de 2 bytes.

Mais Informação

No VBA, os valores do intervalo de número inteiro é de -32768 a +32767 e para valores mais de-2147483648 a 2147483647. Quando efectuar API chama ou chamar uma DLL escrita em C, que pode ser pedido para passar na ou receber valores não assinados no intervalo de 0 a 65535 ou 0 para 4294967296. As funções de conversão fornecidas abaixo converter um número inteiro não assinado para um valor longo e também de um não longo assinado para um valor duplo para objectivos de entrada e de visualização ou outros cálculos.

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

UnsignedToLong

A função tem um valor duplo que contém um valor no intervalo de um não assinados longa e devolve um valor longo pode passar para uma API que requer um não assinado mais.

LongToUnsigned

A função tem um não assinados longo de uma API e converte um valor duplo para fins de apresentação ou aritmética.

UnsignedToInteger

A função tem um valor longo que contém um valor no intervalo de um número inteiro não assinado e devolve um número inteiro que pode passar para uma API que requer um número inteiro não assinado.

IntegerToUnsigned

A função assume um número inteiro não assinado de e a API e converte-o para um valor longo para fins de apresentaçã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 uma não assinados longo como um parâmetro e devolve um não assinados longo como resultado código. Porque o VBA só compreende longos assinados, utiliza a 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 longo) para um assinado longo para fins de accione a API. A função LongToUnsigned efectua a conversão contrária.

Sem estas funções, o argumento de entrada teria de ter sido especificada como uma assinado longo, neste caso-994967296 e o valor de retorno teria ser apresentado como um valor assinado, possivelmente também como um negativo de número e não intuitiva.

Exemplo do Step by Step

  1. Crie um novo projecto VBA.
  2. Adicione o seguinte código a 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. Apenas o Visual Basic: executar o projecto e colocar em pausa.
  4. Escreva o seguinte na janela Immediate/Debug:
          ?UnsignedToLong(3300000000)
          ?LongToUnsigned(-55)
          ?UnsignedToInteger(45000)
          ?IntegerToUnsigned(-3000)
  5. 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/ ) Não como para transmissão e regressar assinado inteiros a DLL de 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 32-Bit 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )