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

ipk*_*iss 21 c binary processor cpu-registers

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

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

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

Tom*_*ych 18

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

  • +1彻底.虽然实际上很少有架构不是有符号整数存储的二进制补码. (2认同)

Stu*_*tLC 15

例如,(数字)-92具有二进制形式: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)
Run Code Online (Sandbox Code Playgroud)

或者,如果该值是无符号字节,则MSB仅被视为2的下一个幂,与所有低位相同,即10100100可以表示:

(再次,权力为2,从右到左,并省略0两个权力)

4 + 32 + 128 
= 164
Run Code Online (Sandbox Code Playgroud)

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

–2147483648 to 2147483647
Run Code Online (Sandbox Code Playgroud)

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

0 to 4294967295
Run Code Online (Sandbox Code Playgroud)

  • +1 - 如果你只是在不知道它们的类型的情况下给出一些字节,它可以是一个int,一个unsigned int,一个float,一个char,一个struct ......任何东西. (3认同)

bw1*_*024 6

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

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