签了两个补码算术

Asa*_*nif 5 c types

我在考虑数据类型范围,出现了一个问题.我们知道签名char的范围是从-128到127.我得到了127的结果,即0111111 = +127

但我无法得到-128如何来?如果我们只是ON符号位,我们得到11111111,它是如何等于-128?

Ano*_*on. 8

大多数情况下,计算机使用所谓的2的补码来表示有符号整数.

2的补码方式是可能的值在一个巨大的循环中,从0到MAX_VALUE,到MIN_VALUE,到零,依此类推.

所以最小值是最大值+1 - 01111111 = 127,和10000000 = -128.

这具有与无符号算术完全相同的良好特性 - 如果我想做-2 + 1,我有11111110 + 00000001 = 11111111 = -1,使用与无符号加法相同的硬件.

低端有一个额外值的原因是我们选择将高位设置的所有数字都设为负数,这意味着0取值为正值.

  • 值得指出的是**表示`11111111`是最小可表示的数字,它确实是-127 - 这是"符号 - 幅度"形式.在符号量级中,有两个零 - 分别为"+ 0"和"-0","00000000"和"10000000". (2认同)

小智 2

二进制补码中,-128 是 10000000。