ID do artigo: 31510 - Última revisão: terça-feira, 5 de julho de 2005 - Revisão: 2.1

INFO: Operador bit a bit do complemento parece falham em comparação

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

O operador bit a bit complemento (~) parece funcionar incorretamente quando um aplicativo utiliza para comparar os caracteres não assinados. Antes do compilador usa o operador bit a bit complemento, ele executa as "usuais aritméticas conversões" que são descritas em detalhes no manual "Referência da linguagem C". Converter o operando completado em um caractere não assinado. Isso impede que o compilador de realizar conversões de aritméticas. O exemplo de código a seguir retorna o valor "falhou" Embora pareça que valores "j" e "~ i" deve ser o mesmo.

Código de exemplo

/*
 * Compile options needed: none
 */ 

#include <stdio.h>

main()
{
   unsigned char i = 4;
   unsigned char j = ~i;

   if (j == ~i)
      printf("passed\n");
   else
      printf("failed\n");
}
O compilador executa as seguintes quatro etapas para avaliar a expressão "se (j == ~ i)":
  1. O compilador converte o "i" operando como um inteiro não assinado.
  2. O compilador complementa os bits desse inteiro sem sinal. Em sistemas que usam números inteiros de 16 bits, o byte alto se torna 0xFF; em sistemas que usam inteiros de 32 bits, os três bytes altos se tornam 0xFFFFFF.
  3. O compilador converte o operando "j" para um inteiro não assinado. Em sistemas que usam números inteiros de 16 bits, o byte alto se torna 0 x 00; em sistemas que usam inteiros de 32 bits, os três bytes altos se tornam 0x000000.
  4. O compilador compara dois operandos.
A comparação falhará porque os bytes altos dos operandos diferem.

Para contornar essa situação, modifique a comparação da seguinte maneira:

   if (j == (unsigned char)~i)

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Standard Edition
  • Microsoft Visual C++ 6.0 Service Pack 5
Palavras-chave: 
kbmt kbcompiler kbinfo KB31510 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: 31510  (http://support.microsoft.com/kb/31510/en-us/ )
Retired KB ArticleAviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.