Comme sont différentes représentations binaires des nombres (par exemple, prenez BIG / Petit Endian), est cette plate-forme inter-plate-forme: en d'autres termes, le compilateur prend-il toujours soin de la différence de représentation binaire des nombres de taille forte> de taille fixe forte> non signé, ou de sa plate-forme spécifique à la plate-forme? p> et que si Que dit standard em> à propos de cela? p> P.S. Et, oui fort>, je suis intéressant dans les deux - Je peux coller un exemple réel, si nécessaire, mais le poteau deviendra trop long SUB> P> P> variable code> est signé type intégral (par exemple ,
int code>) et sa valeur est p>
c code> et
C ++ code>, s'il vous plaît ne me dis pas qu'ils sont des langues différentes, parce que je sais Ceci :) SUB> P>
3 Réponses :
sauf si 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. P>
BlockQuote> 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 C11 indique dans Le résultat de SE SED-NUMBLE-NUMBLE NUMBER n'est pas portable. P> Donc, le Général em> Réponse pour les entiers dans Général em> est: p> quelque_unsigned_type code> 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:
5.8 opérateurs de décalage code> dans la norme C ++ dit également ceci: p>
courte valeur code> de 17 bits, cela peut vous donner ub sur certaines machines, mais pas tous. P>
6.5.7 Opérateurs de décalage bitwise CODE>, mis à part d'autres choses, ceci: p>
E1 >> E2 code> est
E1 code> droite-décalé
E2 code> Positions de bits. Si
E1 code> a un type non signé
ou si
E1 code> 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 code>
E2 code> sup>. si
E1 code> a un type signé et une valeur négative, la
La valeur résultante est définie par la mise en œuvre. strong> p>
blockQquote>
Les manipulations biteux sur les entiers sont pas em> portables. h2> p>
É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 i>. En outre, Endian-Ness. Tous les entiers ne sont pas portables i>.
@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 i> à ce que vous voir i>. 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 & code>? Si je prends
-1 code> 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 b>. Est-ce que je manque quelque chose?
Disclaimer de non-responsabilité: strong> Je suppose implicitement que vous parlez d'un type d'entiers avec une largeur fixe. Un bit-shifting Sinon est assez dangereux ... P>
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. P>
2 em> la valeur de 3 em> La valeur de Pour la même raison, je penserais que le bitwise 10 em> l'opérande de 1 em> 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. P>
1 em> 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. P>
blockQuote>
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 em>, alors même si je crois qu'ils font référence à leurs homologues mathématiques que je peux offrir aucune assurance . p>
(*) Merci à Phresnel pour pointer cela. P>
E1 << e2 code> est
E1 code> gauche-décalé
E2 code> positions bits; Les bits vacants sont remplis de zéro. Si
E1 code> a un type non signé, la valeur du résultat est
E1 × 2 code>
E2 code> sup>, réduit modulo un plus que la valeur maximale représentée dans le type de résultat. Sinon, si
E1 code> a une valeur signée et une valeur non négative, et
E1 × 2 code>
E2 SUP> est représentable dans le type de résultat, alors c'est la valeur résultante; Sinon, le comportement est indéfini. P>
E1 >> E2 code> est
E1 code> droite décalé
E2 code> Positions de bits. Si
E1 code> a un type non signé ou si
E1 code> a un type signé et une valeur non négative, la valeur du résultat fait partie intégrante du quotient de
E1 / 2 CODE>
E2 code> sup>. Si
E1 code> a un type signé et une valeur négative, la valeur résultante est définie par la mise en œuvre. P>
blockQuote>
et code>,
ou code> et
nier code> sont corrects: ils sont définis mathématiquement. P >
~ code> doit avoir un type d'énumération intégré ou non codifié; Le résultat est le complément de son opérande. P>
[...] Définition des quarts de travail est [...] non affecté par la représentation [...] matérielle. Code> VS. B>
Si E1 a un type signé et une valeur négative, la valeur résultante est définie par la mise en œuvre. Code>
Oui, je parlais vraiment de types d'intégrale de taille fixe. Mon mauvais pour ne pas mentionner ça. A propos du * code> - "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 code> é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 code> aussi.
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. P>
Quelle version de c? Si vous ciblez C99, vous avez accès à
STDINT.H CODE>, 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.