【发布时间】:2021-02-09 08:32:50
【问题描述】:
我只是想澄清一下 C# 位移。
当我将 UINT32 的位向右移动 32 位时,我将值移回。我的预期结果是将值归零00000000
例如:
System.Diagnostics.Debug.WriteLine((Convert.ToUInt32("FFFFFFFF", 16) >> 8).ToString("X8"));
System.Diagnostics.Debug.WriteLine((Convert.ToUInt32("FFFFFFFF", 16) >> 16).ToString("X8"));
System.Diagnostics.Debug.WriteLine((Convert.ToUInt32("FFFFFFFF", 16) >> 24).ToString("X8"));
System.Diagnostics.Debug.WriteLine((Convert.ToUInt32("FFFFFFFF", 16) >> 32).ToString("X8"));
System.Diagnostics.Debug.WriteLine((Convert.ToUInt32("FF", 16) >> 8).ToString("X"));
System.Diagnostics.Debug.WriteLine((Convert.ToUInt32("FFFF", 16) >> 16).ToString("X"));
System.Diagnostics.Debug.WriteLine((Convert.ToUInt32("FFFFFF", 16) >> 24).ToString("X"));
System.Diagnostics.Debug.WriteLine((Convert.ToUInt32("FFFFFFFF", 16) >> 32).ToString("X"));
生产
00FFFFFF
0000FFFF
000000FF
FFFFFFFF
0
0
0
FFFFFFFF
有人能解释一下为什么会这样吗?
【问题讨论】:
-
在 C 和 C++ 中,行为是未定义的,允许编译器选择最快的指令。在 C# 中,行为被定义为
lhs >> (0x1f & rhs)以给出确定性。 -
啊,这就是我所追求的。我真的很想知道为什么。这就说得通了。请张贴作为答案,因为这是我所追求的信息。