Eu sei que os valores inteiros 0
e -0
são essencialmente os mesmos. Mas, estou me perguntando se é possível diferenciá-los.
Por exemplo, como posso saber se uma variável foi atribuída -0
?
bool IsNegative(int num)
{
// How ?
}
int num = -0;
int additinon = 5;
num += (IsNegative(num)) ? -addition : addition;
O valor -0
salvo na memória é exatamente da mesma forma que 0
?
c++
int
zero
negative-number
Filip Minx
fonte
fonte
int
é representado no complemento de 2 (de longe o mais comumente encontrado)0
e-0
têm representações bit a bit idênticas.int
. Veja a codificação complementar de Um .Respostas:
Depende da máquina que você está almejando.
Em uma máquina que usa uma representação de complemento de 2 para inteiros, não há diferença no nível de bits entre
0
e-0
(eles têm a mesma representação)Se sua máquina usasse um complemento , você definitivamente poderia
Obviamente, estamos falando sobre o uso de suporte nativo , os processadores da série x86 têm suporte nativo para a representação de complemento de dois números com sinal. Usar outras representações é definitivamente possível, mas provavelmente seria menos eficiente e exigiria mais instruções.
(Como JerryCoffin também observou: mesmo que o complemento de alguém tenha sido considerado principalmente por razões históricas, as representações de magnitude assinada ainda são bastante comuns e têm uma representação separada para zero negativo e positivo)
fonte
0
e-0
são diferentes ? Sinceramente, esperava que ele se comportasse mais como permitindo representações de dois bits do mesmo valor, e seu programa pode usar o que quiser.-0
, ou seja, o resultado da aplicação do-
operador unário à constante inteira0
, seja uma representação zero negativa. Independentemente da representação, o padrão nunca diz0
e-0
são valores matematicamente diferentes, apenas que pode haver um padrão de bit negativo-zero. Se houver, ainda representa o mesmo valor numérico, 0.Para uma
int
(na representação quase universal de "complemento de 2") as representações de0
e-0
são iguais. (Eles podem ser diferentes para outras representações de número, por exemplo. IEEE 754 ponto flutuante.)fonte
Vamos começar representando 0 no complemento de 2 (claro que existem muitos outros sistemas e representações, aqui estou me referindo a este específico), assumindo 8 bits, zero é:
Agora vamos inverter todos os bits e adicionar 1 para obter o complemento de 2:
temos
0000 0000
, e essa é a representação de -0 também.Mas note que no complemento de 1, 0 com sinal é 0000 0000, mas -0 é 1111 1111.
fonte
Decidi deixar essa resposta aberta, pois as implementações de C e C ++ costumam estar intimamente relacionadas, mas na verdade ela não segue o padrão C como pensei. A questão é que o padrão C ++ não especifica o que acontece em casos como esses. Também é relevante que representações que não sejam de complemento de dois sejam extremamente raras no mundo real e que, mesmo onde existem, muitas vezes escondem a diferença em muitos casos, em vez de expô-la como algo que alguém poderia facilmente esperar descobrir.
O comportamento dos zeros negativos nas representações de inteiros em que existem não é definido com tanto rigor no padrão C ++ como no padrão C. No entanto, ele cita o padrão C (ISO / IEC 9899: 1999) como uma referência normativa no nível superior [1.2].
No padrão C [6.2.6.2], um zero negativo só pode ser o resultado de operações bit a bit, ou operações onde um zero negativo já está presente (por exemplo, multiplicar ou dividir zero negativo por um valor, ou adicionar um zero negativo a zero) - a aplicação do operador menos unário a um valor de zero normal, como em seu exemplo, garante, portanto, um zero normal.
Mesmo nos casos que podem gerar um zero negativo, não há garantia de que o farão, mesmo em um sistema que suporta zero negativo:
Portanto, podemos concluir: não, não existe uma maneira confiável de detectar este caso. Mesmo que não seja pelo fato de que representações que não sejam de complemento de dois são muito incomuns em sistemas de computador modernos.
O padrão C ++, por sua vez, não faz menção ao termo "zero negativo", e tem muito pouca discussão sobre os detalhes de magnitude sinalizada e representações de complemento de alguém, exceto para observar [3.9.1 para 7] que eles são permitidos.
fonte
_Bool
ou_Complex
ou inicializadores designados ou literais compostos em C ++). O padrão C ++ sabe como incorporar o padrão C quando quiser - por exemplo, [basic.fundamental] / p3: "Os tipos inteiros com e sem sinal devem satisfazer as restrições fornecidas no padrão C, seção 5.2.4.2.1."Se a sua máquina tiver representações distintas para
-0
e+0
,memcmp
será capaz de distingui-los.Se bits de preenchimento estiverem presentes, pode haver várias representações para valores diferentes de zero também.
fonte
Na especificação da linguagem C ++, não existe um int como zero negativo .
O único significado que essas duas palavras têm é o operador unário
-
aplicado a0
, assim como três mais cinco é apenas o operador binário+
aplicado a3
e5
.Se houvesse um zero negativo distinto , o complemento de dois (a representação mais comum de tipos inteiros) seria uma representação insuficiente para implementações em C ++, pois não há como representar duas formas de zero.
Em contraste, os pontos flutuantes (seguindo o IEEE) têm zeros positivos e negativos separados. Eles podem ser distinguidos, por exemplo, ao dividir 1 por eles. O zero positivo produz infinito positivo; zero negativo produz infinito negativo.
No entanto, se houver diferentes representações de memória do int 0 (ou de qualquer int ou de qualquer outro valor de qualquer outro tipo), você pode usar
memcmp
para descobrir que:Claro, se isso acontecesse, fora das operações diretas de memória, os dois valores ainda funcionariam exatamente da mesma maneira.
fonte
Para simplificar, achei mais fácil visualizar.
O tipo int (_32) é armazenado com 32 bits . 32 bits significa 2 ^ 32 = 4294967296 valores exclusivos . Portanto :
intervalo de dados int sem sinal é de 0 a 4.294.967.295
No caso de valores negativos, depende de como eles são armazenados. Em caso
No caso do complemento de Um, o valor -0 existe.
fonte
int
não é armazenado em 32 bits são mais populares do que plataformas com um complemento hoje em dia.