当您将Int32设置为Int16时,幕后会发生什么?

Cha*_*ion 1 .net c# runtime

当我这样做时,在低水平发生了什么?

Int32 a = 0;
Int16 b = 50;

a = b;
Run Code Online (Sandbox Code Playgroud)

Bar*_*lly 7

像这样的东西:

IL_0001:  /* 1F   | 32               */ ldc.i4.s   50
IL_0003:  /* 0B   |                  */ stloc.1
IL_0004:  /* 07   |                  */ ldloc.1
IL_0005:  /* 0A   |                  */ stloc.0
Run Code Online (Sandbox Code Playgroud)

在较低级别,它取决于机器架构和优化级别.像这样的代码,没有任何影响,可能只是完全省略.否则,它将是简单的代码,也许是这样的:

movsx eax, word ptr [ebp+12]
mov [ebp+8], eax
Run Code Online (Sandbox Code Playgroud)

movsx是x86指令,它在加载到更大的目的地时保留较短数字的符号; 基本上,它会查看较小源的最高位,并在扩展数字时将其复制到剩余的位中.