当将bool设置为TRUE时,.Net程序集添加了多余的AND?

Ozz*_*zah 7 c# clr assembly

以下用VS2010中的C#编写的.Net 4.0代码:

bool b = false;
Run Code Online (Sandbox Code Playgroud)

有以下反汇编:

XOR EDX,EDX
MOV DWORD PTR[EBP-3Ch],EDX
Run Code Online (Sandbox Code Playgroud)

这很有道理.

但是,以下代码:

bool b = true;
Run Code Online (Sandbox Code Playgroud)

有以下反汇编:

MOV EAX,1
AND EAX,0FFh
MOV DWORD PTR[EBP-3Ch],EAX
Run Code Online (Sandbox Code Playgroud)

这次AND行动的目的是什么?为什么不MOV EAX,1呢?

Line | EAX
-----------
   1 | 0x01
   2 | 0x01 & 0xFF = 0x01
   3 | 0xFF
Run Code Online (Sandbox Code Playgroud)

SAJ*_*SAJ 1

这段代码

bool a = true;
bool c = false;
Run Code Online (Sandbox Code Playgroud)

生成此 IL 程序集:

IL_0001:  ldc.i4.1    
IL_0002:  stloc.0     
IL_0003:  ldc.i4.0    
IL_0004:  stloc.1   
Run Code Online (Sandbox Code Playgroud)

可以看到,在中间语言中,代码本质上是一样的。抖动是如何转化的,或者为什么它不能为两者有效地并行代码,这是非常奇怪的。

(我把它作为答案而不是评论,这样我就可以将讨论格式化为可读的。)