Que se passe dans les coulisses lorsque vous définissez un Int32 égal à un Int16?

voix
1

Ce qui se passe à un niveau bas quand je fais cela?

Int32 a = 0;
Int16 b = 50;

a = b;
Créé 27/08/2009 à 06:32
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
7

Quelque chose comme ça:

IL_0001:  /* 1F   | 32               */ ldc.i4.s   50
IL_0003:  /* 0B   |                  */ stloc.1
IL_0004:  /* 07   |                  */ ldloc.1
IL_0005:  /* 0A   |                  */ stloc.0

A un niveau plus bas, cela dépend de l'architecture de la machine et le niveau d'optimisation. Code comme celui-ci en particulier, qui n'a aucun effet, sera probablement juste être complètement omis. Dans le cas contraire, ce sera un code simple, peut-être comme ceci:

movsx eax, word ptr [ebp+12]
mov [ebp+8], eax

movsxest l'instruction x86 qui conserve le signe d'un nombre plus courte quand il est chargé dans une plus grande destination; Au fond, il se penche sur le bit le plus significatif de la plus petite source et la copie dans les bits restants quand il est l'extension du nombre.

Créé 27/08/2009 à 06:38
source utilisateur

voix
2

De réflecteur:

.method public hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] int32 num,
        [1] int16 num2)
    L_0000: nop 
    L_0001: ldc.i4.0          ; Load the constant 0
    L_0002: stloc.0           ; Store the value into local var 0
    L_0003: ldc.i4.s 50       ; Load the constant 50 - notice it treats it as a 32-bit value
    L_0005: stloc.1           ; Store the value into local var 1
    L_0006: ldloc.1           ; Load local var 1
    L_0007: stloc.0           ; Store the value into local var 0
    L_0008: ret 
}

Au niveau IL, rien de spécial qui se passe dans l'affectation, mais avis que ldc.i4.s 50traite la valeur littérale comme un nombre entier de 4 octets (32 bits).

Lorsque le code est compilé JIT, le code assembleur résultant favorise probablement la valeur de 50 à une valeur large 32 bits.

Créé 27/08/2009 à 06:41
source utilisateur

voix
0

La pile d'évaluation ne possède pas de représentation inférieure à 32 bits. [Modifier, dans la plupart des cas (merci pour la mise à jour du commentaire :)] Jusqu'à ce que vous stockez en fait une valeur 16 bits quelque part autre que la pile, rien de spécial se passe parce que la shortet intsont de la même taille. Voici les seules opérations où vous verriez une différence:

  • b = (short)a
    Signerez-bit 16 s'étendre du résultat à une pleine largeur variable de 32 bits. Ceci est l' conv.i4instruction mentionnée dans le commentaire.
  • *(short*)c = b ou l' affectation à un membre struct où le struct est marqué StructLayout.Explicitou a un emballage inférieur à 4.
    écrivent seulement les 16 bits inférieurs de sa représentation 32 bits.
  • checked { b = (short)a; }
    Jetteront une exception si (a < -32768 || a > 32767).
Créé 27/08/2009 à 07:07
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more