10
votes

Comment puis-je simuler une union C ++ en C #?

J'ai une petite question sur les structures avec le fichier layoutkind.explicite attribut. J'ai déclaré le struct comme vous pouvez le constater, avec un FieldTotal avec 64 bits, étant FieldFirst Les 32 premiers octets et Champsecondes Les 32 derniers octets. Après avoir défini les deux FieldFirst et FIGHIQUESCOND TO INT32.MAXVALUE , j'attendrais Fieldtotal Pour être Int64 .Maxvalue , qui ne se produit réellement. Pourquoi est-ce? Je sais que C # ne prend pas vraiment en charge les syndicats C ++, peut-être que cela ne lira peut-être que les valeurs seulement lorsqu'elles sont interopées, mais lorsque nous essayons de définir les valeurs qu'elle ne le gérera tout simplement pas vraiment? xxx


0 commentaires

3 Réponses :


6
votes

En regardant les valeurs hexagonales si int32.maxvalue et INT64.MAXValue devraient fournir la réponse.

La clé est le bit le plus significatif. Pour un entier positif, le bit le plus significatif n'est défini que pour un nombre négatif. La valeur maximale de INT32 est donc un 0 suivi d'une série complète de 1s. L'ordre est sans importance, juste qu'il y aura au moins un seul 0 bit. La même chose est vraie de INT64.MAXValue.

considère maintenant comment une union devrait fonctionner. Il établira essentiellement les bits des valeurs à côté des autres. Alors maintenant, vous avez un ensemble de bits de 64 de longueur contenant deux valeurs 0 bit. Un pour chacune des instances INT32.MAXValue. Cela ne peut jamais être égal à INT64.MAXValue car il ne peut contenir qu'un seul 0 bit.

Assez bien, vous obtiendrez probablement le comportement que vous recherchez si vous définissez des champsecond à int32.minvalue.

EDIT a manqué de le faire sur le terrain (4).


0 commentaires

10
votes

La raison en est que le champ FieldOffsetAttribute prend un certain nombre d'octets comme paramètre - pas le nombre de bits. Cela fonctionne comme prévu: xxx


1 commentaires

De plus, ce que Reed & Jared dit de Signé vs. non signé.



5
votes

Ben M a fourni l'un des Les éléments les plus importants - Votre définition n'est pas configurée correctement.

Cela étant dit, cela ne fonctionnera pas - même en C ++ avec un syndicat. Les valeurs que vous avez spécifiées ne seront pas (et ne devraient pas être) les mêmes valeurs, car vous utilisez des INT signés (non non signé). Avec un INT signé (int32), vous allez avoir un 0 bit suivi de 1 bits. Lorsque vous faites le syndicat, vous vous retrouverez avec un bit 0 un peu, suivi d'un tas de 1 bits, puis un autre 0 bit, puis un tas de 1 bits ... le deuxième 0 bit est ce qui vous gâte.

Si vous avez utilisé UINT32 / UINT64, cela fonctionnerait une propriété, car le bit de signalisation supplémentaire n'existe pas.


1 commentaires

Oui, tu as raison. Avec ce que vous avez dit et Ben dit, cela fonctionne comme prévu. Merci!