0
votes

Comment créer un numéro binaire négatif à l'aide de signé / non signé en C?

Mes pensées: Si on déclare un int , il reçoit fondamentalement un non signé INT . Donc, si j'ai besoin d'une valeur négative, je dois créer explicitement une INT signée.

J'ai essayé xxx

donc je me trompe qu'un entier signé en binaire est une valeur négative ?
Comment puis-je créer une valeur négative en format binaire?

edit Si j'utilise 16/32/64 bits, je reçois le même résultat. non signé / signé La DOIT semble faire une différence sans déplacer manuellement les bits.

c int

2 commentaires

int est toujours signé , il n'y a donc aucune différence entre A et b dans votre exemple. Le moyen le plus courant de représenter des types d'entiers signés est Deux complémentaires , alors s'il vous plaît En savoir plus à ce sujet .


-10 In 2's Complément est Les principaux ... 11110110 . Pourquoi vous attendez-vous à 0B10000101 BE -10?


4 Réponses :


2
votes

Gardez à l'esprit que, selon votre cible, int pourrait être 2 ou 4 octets. Cela signifie que int A = 0b10000101 n'est pas assez de bits pour régler le bit de signalisation.

Si votre int est de 4 octets, vous avez besoin 0B10000000 0000000 0000000 00000000 (espaces ajoutés pour la clarté).

par exemple sur une cible 32 bits: xxx


6 commentaires

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 est par défaut signé , vous devez vraiment spécifier non signé . Gardez également à l'esprit que d'imprimer non signé, vous devez utiliser % u .


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é



1
votes

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;


5 commentaires

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 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.



2
votes

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 INT est de 32 bits, alors 0b111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 L 'EST -1 ET 0B100000000000000000000000000000000000000000000000000000000 IS INT_MIN .

ajuster pour la taille int (8 | 16 | 64) _T , changez simplement le nombre de bits. Le bit de signalisation est toujours le MSB.


0 commentaires

1
votes

Comment créer un numéro binaire négatif à l'aide de signé / non signé en C?

Nettoyez simplement la constante d'une valeur positive. Tenter de le faire avec plusieurs 1 ... 1110110 suppose une largeur de bit pour int . Mieux vaut être portable. xxx

sortie xxx


2 commentaires

Qu'est-ce que cela a à voir avec la déclaration signée / non signée?


@Strangerthings 0b1010 est une constante entière de type signée int . L'affectation à une variable int comme signée int b = one_value n'est pas nécessaire pour atteindre "Comment créer un numéro binaire négatif". -0B1010 est un "nombre binaire négatif".