【问题标题】:Is there a way computer can have same representation for two different numbers? [closed]有没有办法计算机可以对两个不同的数字进行相同的表示? [关闭]
【发布时间】: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


【解决方案1】:

当您将负数向右移动时,会在开头添加位 1,而不是 0。因此,当您将值 0xFF000000 向右移动时,您会得到 0xFFFFFFFF(顺便说一句,这是 -1)。这样可以确保负数保持负数,不会因为移位操作而突然变为正数。

但是,这适用于您在此处写入的 Int32 值。但是用代码

(a & 0xFF000000)

您会得到Int64long 类型的结果,而不是int(或Int32)。因此,您实际上拥有的不是0xFF000000,而是一个正数0x00000000FF000000。如果你把它移到右边,你会得到0x00000000000000FF,这是正数255

0xFF000000UInt32 值。将它与 Int32 值和 & 运算符结合使用会产生 Int64 值。

int a = 4;
uint b = 15;
object c = a & b;
Console.WriteLine($"{a} - {a.GetType()}");
Console.WriteLine($"{b} - {b.GetType()}");
Console.WriteLine($"{c} - {c.GetType()}");

这会产生以下输出:

4 - System.Int32
15 - System.UInt32
4 - System.Int64

【讨论】:

  • FF000000 如何既是 Int32 又是 UInt32 值?
  • @HIMANSHUGARG 这取决于上下文你所拥有的十六进制表示的含义以及你在哪里使用它,但你在代码中拥有的实际整数文字 0xFF000000 是一个 UInt32 值。跨度>
  • Progman-您能否详细说明一下。我不明白的是 a(-16777216) 的值是 FF000000 以及 4278190080 的值在 Int32 中也是 FF000000 吗?
  • @HIMANSHUGARG 当您在源代码中将代码 0xFF000000 写成整数文字时(正如您在问题中所做的那样),此值将是 UInt32 值,因为它代表的值( 4278190080) 不能放入 Int32 变量中。此行为在 C# 规范“7.4.5.3 整数文字”中定义。当您想要来自该确切十六进制字符串的Int32 值时,您必须使用stackoverflow.com/questions/1139957/… 中提到的其他方法。
【解决方案2】:

没有。这实际上不是计算机问题 - 系统 他们自己 不允许这样做:

  • 每个数字都可以表示
  • 但每个数字只能以一种方式表示

但是同一个数字可以有很多可能的字符串表示。

在您的情况下,您似乎混淆了0xFF0000000x000000FF?或者只是想知道为什么正确的变速垫带有 1?很难说。

【讨论】:

  • Christopher 该数字在使用 0xFF000000 屏蔽时保持不变,除了该数字不再是有符号整数。怎么样?
  • @HIMANSHUGARG ???你给了我们字节的十六进制表示。这并没有告诉我们关于它被解释为有符号或无符号整数的任何信息。我只能说:如果它是一个有符号的整数,你交换了符号。
猜你喜欢
  • 1970-01-01
  • 2017-01-03
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 2019-06-15
  • 2022-08-16
相关资源
最近更新 更多