Como C trata o número 0 na arquitetura de complemento de alguém?
Estive estudando recentemente o sistema de complemento de representação de números e, pelo que entendi, existem duas variantes do número 0. Há um zero negativo (-0) e um zero positivo (+0).
Minha pergunta é, na arquitetura de complemento de alguém, como exatamente essa anomalia é tratada em C? C faz uma distinção entre -0 e +0 ou essas duas formas são simplesmente tratadas como zero.
Se for o caso que +0 e -0 retornem VERDADEIRO quando testados para zero, pergunto-me como funcionaria o código de exemplo a seguir que calcula o número de bits definidos em um número inteiro se inserirmos -0 como entrada.
int bitcount(int x)
{
int b;
for (b = 0; x != 0; b++)
x &= (x-1);
return b;
}
Como -0, em um complemento, tem todos os seus bits definidos como 1, -0 deve retornar a maior quantidade de bits definida em qualquer outro número; no entanto, parece que esse código falharia na condição de teste de loop dex != 0
, e nem entraria no loop, fornecendo um resultado incorreto.
Seria possível, de alguma forma, em C, na arquitetura de complemento de alguém, tornar a condição do loop sensível a zeros positivos como em:x != +0
Além disso, se eu subtraísse 1 de +0, obteria -0 ou -1. Em outras palavras, +0 - 1 = -0 na arquitetura de complemento de alguém?
Em suma, para não sair muito do rumo nesta discussão, estou apenas me perguntando como C trata as peculiaridades do número 0 na arquitetura de complemento de alguém.