Langage C - opérateur binaire
Discutez d'informatique ici !
-
MacErmite
- Membre Relatif
- Messages: 408
- Enregistré le: 12 Mai 2006, 13:00
-
par MacErmite » 08 Juil 2010, 07:24
Bonjour,
Dans l'exemple suivant je ne comprends pas pourquoi cela renvoie la valeur -4 :
#include
int main(){
int nombre=3;/* 11 en binaire */
nombre = ~ nombre;
printf("%d", nombre);/* Sortie -> -4 */
}La fonction ~ renvoie le complément à deux. Alors si je comprends cela donne :
puis le complément à 1 :
et enfin le complément à deux :
:doh:
Pouvez-vous m'aider ?
-
fatal_error
- Modérateur
- Messages: 6610
- Enregistré le: 22 Nov 2007, 13:00
-
par fatal_error » 08 Juil 2010, 08:02
yo,
moi jvois dans la doc que ca donne un bitwise not sur wiki. C'est pas pareil qu'un complément à 2
Mais je saurais pas expliqué pourquoi on a -4 et la j'ai pas le temps
la vie est une fête
-
uztop
- Membre Complexe
- Messages: 2396
- Enregistré le: 12 Sep 2007, 12:00
-
par uztop » 08 Juil 2010, 21:01
Salut,
int est un type qui fait 4 ou 8 octets selon les architectures. Si on est à 32 bits, ça sera 4 octets et donc 3 va s'écrire 00000000 00000000 00000000 00000011
Quand tu fais la négation (~ est un opérateur qui remplace tous les 0 par des 1 et inversement), tu obtiens 11111111 11111111 11111111 11111100.
Etant donné que int est un type signé, cette valeur vaut -4 (
http://fr.wikipedia.org/wiki/Compl%C3%A9ment_%C3%A0_deux)
-
MacErmite
- Membre Relatif
- Messages: 408
- Enregistré le: 12 Mai 2006, 13:00
-
par MacErmite » 09 Juil 2010, 21:28
suite à la lecture de ton lien, je comprends l'opération "complément à 2" :
Pour coder (;)4) :
On prend le nombre positif 4 : 00000100
On inverse les bits : 11111011
On ajoute 1 : 11111100
Cependant si je suis devant 11111100 comment pensé qu'il s'agit de -4 et non de 252 ?
-
Ben314
- Le Ben
- Messages: 21532
- Enregistré le: 11 Nov 2009, 22:53
-
par Ben314 » 09 Juil 2010, 21:56
Tout dépend le type de la variable dont c'est le contenu :
Si c'est une variable signée (SIGNED ...) ce qui est le cas par défaut pour le type INT, le bit le plus à gauche te dit si tu as affaire à un négatif ou pas :
Si tes 8 bits sont ceux d'un CHAR (qui est SIGNED par défaut) alors ils représentent la valeur -4
Si c'est une variable non signée (UNSIGNED...) alors, le contenu de la variable s'interprète forcément comme un positif :
Si tes 8 bits sont ceux d'un UNSIGNED CHAR alors ils représentent la valeur 252.
Comme dans les versions standard du C, il n'y a pas de contrôle, tu peut faire un mini programme dans lequel tu déclare un SIGNED CHAR A et un UNSIGNED CHAR B.
Tu met ensuite une valeur dans A (par exemple -4...) puis tu fait B=A et tu affiche A et B.
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités