11
votes

Manière standard (plate-forme inter-plate-forme) pour la manipulation du bit

Comme sont différentes représentations binaires des nombres (par exemple, prenez BIG / Petit Endian), est cette plate-forme inter-plate-forme: xxx

en d'autres termes, le compilateur prend-il toujours soin de la différence de représentation binaire des nombres de taille de taille fixe non signé, ou de sa plate-forme spécifique à la plate-forme?

et que si variable est signé type intégral (par exemple , int ) et sa valeur est

  • zéro
  • positif
  • négatif?

    Que dit standard à propos de cela?

    P.S. Et, oui , je suis intéressant dans les deux - c et C ++ , s'il vous plaît ne me dis pas qu'ils sont des langues différentes, parce que je sais Ceci :)

    Je peux coller un exemple réel, si nécessaire, mais le poteau deviendra trop long


2 commentaires

Quelle version de c? Si vous ciblez C99, vous avez accès à STDINT.H , ce qui vous offre de nombreuses options de plate-forme multiplate-forme pour les types entier.


Même si vous êtes intéressé par les deux, C ++ et C, nous ne sommes pas tous couramment les deux langues pour assurer une réponse qui s'applique vraiment aux deux.


3 Réponses :


6
votes

sauf si quelque_unsigned_type est un type de largeur fixe, il s'agit de votre première plate-forme spécifique. Sur une plate-forme, vous obtiendrez peut-être des informations qui ne peuvent jamais se reproduire par la valeur elle-même, tandis que sur une autre, elle n'est peut-être pas. Exemple: xxx

5.8 opérateurs de décalage dans la norme C ++ dit également ceci:

Le comportement est indéfini si le bon opérande est négatif, ou supérieur ou égal à la longueur des bits de l'opérande gauche promu.

Donc, si vous déplacez un entier par plus de bits que vous y trouverez, vous entrez un comportement non défini. Par exemple, si vous avez laissé-shiftez un courte valeur de 17 bits, cela peut vous donner ub sur certaines machines, mais pas tous.

C11 indique dans 6.5.7 Opérateurs de décalage bitwise , mis à part d'autres choses, ceci:

Le résultat de E1 >> E2 est E1 droite-décalé E2 Positions de bits. Si E1 a un type non signé ou si E1 a un type signé et une valeur non négative, la valeur du résultat est l'intégration partie du quotient de E1 / 2 E2 . si E1 a un type signé et une valeur négative, la La valeur résultante est définie par la mise en œuvre.

SE SED-NUMBLE-NUMBLE NUMBER n'est pas portable.

Donc, le Général Réponse pour les entiers dans Général est:

Les manipulations biteux sur les entiers sont pas portables.


7 commentaires

Également § 3.9.1 / 7 "Cette norme internationale permet de complément 2 de 2 représentations de magnitude signée pour des types intégrés". Oublier le changement. Les entiers signés ne sont pas portables . En outre, Endian-Ness. Tous les entiers ne sont pas portables .


@MOOINGDUCK: Bonne, bien que cela nécessite un soutien supplémentaire de la norme qui dit "avec des OP bitwise, vous manipulez des bits physiques". Bien sûr, cela pourrait être possible pour une langue de faire des manipulations de bits portables en traduisant ce que est à ce que vous voir . J'ai ciblé d'abandonner la question par quelque chose de réel :)


C'est vrai, la chose Endian n'est pas pertinente pour les OP bitwises. Mais le 1s Compliment vs 2s Compliment, n'est-ce pas confondant ce qui se passe avec & ? Si je prends -1 et faites le MSB bit zero, le compliment 1S et le compliment 2S donneront des résultats différents, n'est-ce pas?


@Mooing Duck: Ce que je voulais dire, c'est que même si une machine utilise un autre complément sous la hotte, il pourrait encore être requis par une norme de langue qu'elle "traduit" les bits en quelque chose de cohérent; Je sais que cela semble étrange, mais d'une pensée rapide, pas impossible.


Je viens de vérifier la spécification, autre que la promotion intégrale, je ne vois rien. (Ne pas dire que ce n'est pas là, je ne le vois pas)


Oui, oui, je parlais de types de taille fixe, bien sûr. Je viens de l'ajouter dans la question, j'ai oublié de mentionner cela.


De plus, autant que je comprends la citation, il est bien défini pour la signature et non négative, et c'est la mise en œuvre définie uniquement si le type est signé et que le nombre est négatif . Est-ce que je manque quelque chose?



5
votes

Disclaimer de non-responsabilité: Je suppose implicitement que vous parlez d'un type d'entiers avec une largeur fixe. Un bit-shifting Sinon est assez dangereux ...

standard: N3337 C ++ 11

La définition des changements est mathématique pour des types non signés ou des valeurs positives dans des types signés (*), et donc non affecté par la représentation matérielle sous-jacente.

5.8 opérateurs de décalage [expr.Shift]

2 la valeur de E1 << e2 est E1 gauche-décalé E2 positions bits; Les bits vacants sont remplis de zéro. Si E1 a un type non signé, la valeur du résultat est E1 × 2 E2 , réduit modulo un plus que la valeur maximale représentée dans le type de résultat. Sinon, si E1 a une valeur signée et une valeur non négative, et E1 × 2 E2 est représentable dans le type de résultat, alors c'est la valeur résultante; Sinon, le comportement est indéfini.

3 La valeur de E1 >> E2 est E1 droite décalé E2 Positions de bits. Si E1 a un type non signé ou si E1 a un type signé et une valeur non négative, la valeur du résultat fait partie intégrante du quotient de E1 / 2 E2 . Si E1 a un type signé et une valeur négative, la valeur résultante est définie par la mise en œuvre.

Pour la même raison, je penserais que le bitwise et , ou et nier sont corrects: ils sont définis mathématiquement.

5.3.1 opérateurs unaires [expr.unary.op]

10 l'opérande de ~ doit avoir un type d'énumération intégré ou non codifié; Le résultat est le complément de son opérande.

5.11 Bittwise et opérateur [expr.bit.and]

1 les conversions arithmétiques habituelles sont effectuées; Le résultat est le bit et la fonction des opérandes. L'opérateur ne s'applique qu'aux opérandes d'énumération intégrale ou non cacalisée.

5.13 Bittwise inclusive ou opérateur [expr.or]

1 les conversions arithmétiques habituelles sont effectuées; Le résultat est le biot inclus ou la fonction de ses opérandes. L'opérateur ne s'applique qu'aux opérandes d'énumération intégrale ou non cacalisée.

Cependant, je vais admettre que je suis moins sûr pour les deux derniers, je n'ai pas pu trouver de définition de la fonction Bitwise XX , alors même si je crois qu'ils font référence à leurs homologues mathématiques que je peux offrir aucune assurance .

(*) Merci à Phresnel pour pointer cela.


6 commentaires

[...] Définition des quarts de travail est [...] non affecté par la représentation [...] matérielle. VS. Si E1 a un type signé et une valeur négative, la valeur résultante est définie par la mise en œuvre.


Oui, je parlais vraiment de types d'intégrale de taille fixe. Mon mauvais pour ne pas mentionner ça. A propos du * - "Types non signés ou valeurs positives dans les types signés" - Qu'en est-il de zéro? Positif n'est pas le même que non négatif, non?


@Kirilkirov: En fait, 0 devrait aller bien. Pour changer d'exemple, il y a un problème avec le bit de gauche d'un entier signé: en 2 compléments, il représente le signe (0 positif, 1 négatif), donc pour des valeurs négatives en déplaçant votre panneau ... OUPS!


Oui, vous avez raison de négatif, je sais que pour le déplacement, exactement :) Ma question sur le 0 était un peu rhétorique, vous voudrez peut-être mettre à jour votre réponse, si vous le souhaitez, bien sûr. Pouvez-vous me dire quelque chose sur les citations - à partir de quelle norme sont-elles exactement? Et savez-vous s'ils sont les mêmes pour toutes les normes?


@Kirilkirov: J'ai édité la version de la norme dans la réponse, vous avez raison que c'est très important. Je crois comprendre que 0 est généralement considéré comme positif, alors je ne ressens donc pas la nécessité de la préciser.


Je pense que "a une valeur signée et non négative" fait référence à 0 aussi.



1
votes

Il est spécifique de la mise en œuvre si vous changez de chiffres négatifs (ou signés) (par la plupart des implémentations sont la même chose de U2). Il est portable pour la plupart des utilisations si vous changez de numéros non signés par des valeurs ne dépassant pas le nombre de bits en variable.


0 commentaires