Langage C - opérateur binaire

Discutez d'informatique ici !
MacErmite
Membre Relatif
Messages: 408
Enregistré le: 12 Mai 2006, 13:00

Langage C - opérateur binaire

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 ?



Avatar de l’utilisateur
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 ?

Avatar de l’utilisateur
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

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite