【发布时间】:2019-08-03 19:47:30
【问题描述】:
我在 Int32 中有这个数字 -16777216,它的十六进制表示是 FF000000。 将此数字右移 24 得到 0xFFFFFFFF,屏蔽 0xFF000000 然后右移 24 得到 0x000000FF。
Int32 a = -16777216;//FF000000 in hex
Int32 b = a >> 24;
Int32 c = (a & 0xFF000000) >> 24;
为什么 b 和 c 是不同的数字?
【问题讨论】:
-
你的问题是什么?
-
您不清楚您的问题,但请记住,向右移动一位就像乘以 2,所以如果您将 0xFF00 0000 移动一位并尝试将其存储在两个字节中,它会溢出
-
请edit 将您拥有的完整源代码包含在minimal reproducible example 中。详细解释问题是什么以及您期望的结果(以及您得到的结果)。
-
是呼号扩展。你这样做是不对的。例如 8 位中的 -2 (twos compliment ) 是 0xFE。在 16 位中是 0xFFFE。在 24 位中,它是 0xFFFFFE。在 32 位中,它是 0xFFFFFFFE。在 64 位中,它是 0xFFFFFFFFFFFFFFFE。因此,要将 24 位数字签名扩展为 32 位,您可以像这样测试 MSB:results = ((number & 0x800000) > 0)? (数字 | 0xFF000000) : 数字;
标签: c# bit negative-number