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

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

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

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

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

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

不,您需要事先知道是否已使用已签名或未签名的存储来存储该号码,您还需要知道用于存储该号码的编码 。

如果8位整数(即字节)被签名,那么根据Tom和32bitkid,有符号整数通常存储在2的补码中 ,其中最高有效位(MSB)将确定数字是否为负数。

例如,在您的示例中,字节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可表示:

(再次,2的权力,从右到左,并省略2的0幂)

 4 + 32 + 128 = 164 

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

 –2147483648 to 2147483647 

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

 0 to 4294967295 

你想读两个补数。 简而言之,最重要的位可用于确定数字是否为负数。

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

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

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

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