【问题标题】:How to know if a binary integral number represents a negative number?如何知道二进制整数是否代表负数?
【发布时间】:2011-12-09 07:52:18
【问题描述】:

我正在阅读一些 C 文本。在 Negative and Positive Values 环节中,作者提到了以二进制形式表示负数的几种方法。

我完全理解了,想知道如果给定一个二进制数,我们可以确定它是否为负数吗?

例如,-92 具有 8 位二进制形式:10100100。但是如果给定10100100,我们可以说是-92,而不是其他非负数吗?

【问题讨论】:

标签: c binary cpu-registers processor


【解决方案1】:

例如,(数字)-92 具有二进制形式:10100100(以 8 位字节表示)。但是如果给定 10100100,我们可以说是 -92,而不是其他非负数吗?

不,您需要提前知道是否使用了签名或未签名的表示/约定,即使您知道它已签名,那么您还需要知道用于存储号码的encoding

如果8位整数(即字节)是有符号的,那么根据Tom和32bitkid,有符号整数通常存储在2's complement中,Most Significant Bit (MSB)将确定一个数字是否为负数。

例如在您的示例中,字节 10100100 可以表示 signed byte -92,因为:

MSB : 1 means negative
Other 7 Bits 0100100 
Flip and add 1 => 1011011 + 1 = 1011100
From powers of two, right to left : 
0*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 1*2^4 + 0*2^5 + 1*2^6
= 4 + 8 + 16 + 64 
= 92 (and thus -92 because of the MSB)

OR 如果值为无符号字节,则 MSB 仅被视为 2 的下一个幂,与所有低位相同

10100100 可以代表:

4 + 32 + 128 
= 164

(同样,2 的幂,从右到左,省略 0 2 的幂)

整数是否应该带符号以及所需的位数通常取决于您需要存储在其中的值的范围。例如,一个 32 位有符号整数可以表示范围:

–2147483648 to 2147483647

而一个无符号的 32 位整数可以表示来自

的数字
0 to 4294967295

【讨论】:

  • +1 - 如果只是给你一些字节而不知道它们的类型,它可能是 int、unsigned int、float、char、struct ......任何东西。
  • 这应该是公认的答案。这个答案清楚地解释了这个问题。
【解决方案2】:

当然,这取决于表示。在广泛使用的二进制补码中,您只需查看最高有效位。

【讨论】:

  • +1 表示彻底。尽管实际上很少有架构不是用于有符号整数存储的二进制补码。
  • 如果它的补码或符号幅度,代码也只查看最高有效位。除了 -0 之外,2 的补码对于了解符号性并没有什么特别之处。填充和字节序也是考虑因素。知道类型是有符号还是无符号肯定很有价值。
【解决方案3】:

您想阅读two's complement 号码。总之,最高位可以用来判断数是否为负数。

我重读了您的问题,您说您已经了解二进制补码。在处理负数时,必须知道位数以确定该数是否为负数。负数必须符号扩展为所需的位数。您以 32 位存储时的 -92 示例为 11111111111111111111111110100100。

【讨论】:

  • 编辑现有评论而不是添加新评论。
  • 是的,哎呀,我意识到在我已经添加它之后。你的意思是回答,对吧?
【解决方案4】:

您必须知道数字的类型(有符号/无符号)才能确定负数/正数。如果未提及类型,则默认为已签名。如果它是有符号的,那么你可以查看 MSB 位来确定正或负 no 。如果提到它是无符号的,那么你必须计算 MSB 位才能使十进制没有。

【讨论】:

  • “你必须计算 MSB 位才能使十进制不”是什么意思?另外,“MSB”中的“B”表示“位”,所以不必写“MSB位”,可以使用“MSB”,也就是“最高位”。
  • "如果没有提到类型,那么默认情况下它是有符号的" --> 例外,像int x:8 这样的位域可能是无符号的。
【解决方案5】:

如果内存中有值,请将其转换为相同大小的有符号并测试它是否小于零。所以,if ((int)value < 0)

如果您尝试从字符串中解析二进制常量,则需要知道数字的格式。然而,二进制补码已经普及了 50 年。 (一个例外是对某些仍在使用的旧 Unisys 大型机的二进制兼容支持。)为此,您只需要查看第一位(如公认的答案所述)。

【讨论】:

    猜你喜欢
    • 2013-07-06
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2017-07-13
    • 2018-10-10
    • 2016-02-20
    相关资源
    最近更新 更多