2017-09-01 1 views
-6

Le code ci-dessous donne la sortie -1.Négation des bits

#include <iostream> 
using namespace std; 
int main() 
{ 
    int x=0; 
    cout<<~x; 
    return 0; 
} 

Mais quand je fais les modifications suivantes les changements de réponse à 4294967295. veux juste savoir pourquoi que dans le cas d'int il ne donne pas -2147483647 qui est 111 fois .... 32

#include <iostream> 
using namespace std; 
int main() { 
    unsigned int x=0; 
    cout<<~x; 
    return 0; 
} 
+7

Peut-être vous avez besoin d'en savoir plus sur (https://en.wikipedia.org/wiki/Two's_complement) [complément à deux] ? –

+1

Qu'avez-vous prévu? Un 'unsigned' ne peut pas contenir de nombres négatifs, donc 'all bits 1' sera un grand nombre, alors qu'avec un' signed' il ne le sera pas (indice: bit de signe, complément de deux). Quelle est votre question spécifique? –

+0

je veux juste savoir que pourquoi dans le cas de int il ne donne pas -2147483647 qui est 111 .... 32 fois –

Répondre

2

L'opérateur ~ bits dans tous intervertit l'opérande. Ici, x commence comme 0. Donc, en supposant un int est 4 octets large, il a la représentation binaire suivante:

00000000 00000000 00000000 00000000 

Lorsque tous les bits sont vous inversés obtenez:

11111111 11111111 11111111 11111111 

En supposant deux la représentation du complément de entiers, la valeur de cette séquence de bits est -1. Notez que si vous ajoutez 1 à cette valeur, tous les bits deviennent 0 (c'est-à-dire -1 + 1 = 0).

En revanche, une valeur de -2147483647 a la représentation suivante:

10000000 00000000 00000000 00000001