如何知道二进制整数是否代表负数?

时间:2011-10-17 13:42:55

标签: c binary cpu-registers processor

我正在阅读一些C文本。在“否定”和“正值”会话中,作者提到了以二进制形式表示负数的几种方法。

我一直都明白,并且想知道如果给出二进制数,我们能否确定它是否为负数?

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

5 个答案:

答案 0 :(得分:16)

当然,这取决于代表性。在广泛使用的二进制补码中,您只需查看最重要的位。

答案 1 :(得分:12)

  

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

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

如果对8位整数(即字节)进行了签名,那么根据Tom和32bitkid,有符号整数通常存储在2's complement中,其中Most Significant Bit (MSB)将确定数字是否为负数或不

e.g。在您的示例中,字节10100100可以代表有符号字节 -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)

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

即。 10100100可以表示:

4 + 32 + 128 
= 164

(再次,权力为2,从右到左,省略{2}的0权力

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

–2147483648 to 2147483647

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

的数字
0 to 4294967295

答案 2 :(得分:6)

您想要阅读two's complement个数字。简而言之,最重要的位可用于确定数字是否为负数。

我重读了你的问题,你说你已经理解了两个补充。处理负数时,必须知道位数以确定该数字是否为负数。负数必须符号扩展到所需的位数。以32位存储的-92示例为11111111111111111111111110100100。

答案 3 :(得分:0)

必须要求您知道该号码的类型(已签名/未签名)以确定负数/正数。如果未提及type,则默认情况下会对其进行签名。如果它已签名,那么您可以查看MSB位以确定正或否。如果它被称为无符号,则必须将MSB位计数为十进制否。

答案 4 :(得分:0)

如果内存中有该值,请将其转换为相同大小的带符号,然后测试其是否小于零。因此,if ((int)value < 0)

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