Mes pensées: Si on déclare un J'ai essayé p> donc je me trompe qu'un entier signé en binaire est une valeur négative ? int code>, il reçoit fondamentalement un
non signé INT code>. Donc, si j'ai besoin d'une valeur négative, je dois créer explicitement une INT signée.
Comment puis-je créer une valeur négative en format binaire? P> non signé / signé code> La DOIT semble faire une différence sans déplacer manuellement les bits. p> p>
4 Réponses :
Gardez à l'esprit que, selon votre cible, Si votre par exemple sur une cible 32 bits: p> int code> pourrait être 2 ou 4 octets. Cela signifie que
int A = 0b10000101 code> n'est pas assez de bits pour régler le bit de signalisation.
int code> est de 4 octets, vous avez besoin
0B10000000 0000000 0000000 00000000 code> (espaces ajoutés pour la clarté). P>
Consultez mon exemple mis à jour, assurez-vous d'avoir le bon nombre de bits. Double compte si nécessaire, il est facile de sortir.
Oh ok je pensais que je n'ai pas à faire l'opération binaire (retourner les bits) si je déclare signé ou non signé? Alors pourquoi pour l'utiliser?
int code> est par défaut
signé code>, vous devez vraiment spécifier
non signé code>. Gardez également à l'esprit que d'imprimer non signé, vous devez utiliser
% u code>.
Si vous dites "sa signature par défaut" signifie-t-il que son "négatif" par défaut?
@Strangerthings Cela signifie que les valeurs peuvent être négatives ou positives, non signées signifie que vous n'avez que des nombres positifs.
Non, signé ne signifie pas négatif. En savoir plus sur Signé vs non signé
parce que int a = 0b10000101 code> n'a que 8 bits, où vous avez besoin de 16 ou 32. Essayez THI:
unsigned int a = -5;
Cela ne fonctionne pas mais la réponse de Odyn-Kon a travaillé pour moi. Mais je m'attendais à la même chose comme vous.
Vos quatre premiers exemples impliquent tous un comportement non défini en ce qui concerne le langage C. De plus, c Spécifie l'effet de l'attribution d'une valeur négative à un entier non signé de manière à ne pas dépendre de la représentation. Le résultat pas i> a la même représentation sur une machine de signalisation / de magnitude ou de complément - les deux qui permettent explicitement - non pas si vous êtes susceptible de courir dans une telle machine.
@Johnbollinger donc j'ai eu la deuxième partie et vous avez raison. J'ai complètement oublié à ce sujet. Mais pourquoi un comportement indéfini? L'autre chose est que je tente de simplifier parfois des choses pour ceux qui sont débutants.
@Gox, les constantes sont positives. L'attribution d'une grande constante positive à un entier signé afin de provoquer un débordement produit des comportements indéfinis. De même, un déplacement gauche d'un entier signé (y compris une constante entière signée) dont le résultat mathématique est hors de portée pour que le type produit également un comportement non défini.
@Johnbollinger Merci pour votre contribution. J'ai découvert ce que tu dis. Je peux dire que j'ai appris un peu ici.
Si les chiffres sont représentés comme compléments de deux fois, vous devez simplement avoir le bit de signalisation pour vous assurer que le nombre est négatif. C'est le MSB. Si un ajuster pour la taille INT code> est de 32 bits, alors
0b111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 L 'EST
-1 CODE> ET
0B100000000000000000000000000000000000000000000000000000000 CODE> IS
INT_MIN code>. p>
int (8 | 16 | 64) _T code>, changez simplement le nombre de bits. Le bit de signalisation est toujours le MSB. P>
Comment créer un numéro binaire négatif à l'aide de signé / non signé en C? p>
Nettoyez simplement la constante d'une valeur positive. Tenter de le faire avec
plusieurs 1 ... 1110110 Code> suppose une largeur de bit pour
int code>. Mieux vaut être portable. P>
xxx pré> sortie p>
xxx pré> blockQuote>
Qu'est-ce que cela a à voir avec la déclaration signée / non signée?
@Strangerthings 0b1010 code> est une constante entière de type
signée int code>. L'affectation à une variable
int code> comme
signée int b = one_value code> n'est pas nécessaire pour atteindre "Comment créer un numéro binaire négatif".
-0B1010 CODE> est un "nombre binaire négatif".
int code> est i> b> toujours
signé code>, il n'y a donc aucune différence entre
A code> et
b code> dans votre exemple. Le moyen le plus courant de représenter des types d'entiers signés est Deux complémentaires i>, alors s'il vous plaît En savoir plus à ce sujet .
-10 In 2's Complément est
Les principaux ... 11110110 Code>. Pourquoi vous attendez-vous à
0B10000101 CODE> BE -10?