C++ 中的有符号类型表示

Signed type representation in c++

我正在看的书里说:

The standard does not define how signed types are represented, but does specify that range should be evenly divided between positive and negative values. Hence, an 8-bit signed char is guaranteed to be able to hold values from -127 through 127; most modern machines use representations that allow values from -128 through 127.

我假设 [-128;127] 范围来自名为 "twos-complement" 的方法,其中负数是 !A+1(例如 0111 是 7,然后 1001 是 -7)。但我无法理解为什么在一些较旧的(?)机器中值范围 [-127;127]。谁能澄清一下?

一个的补码和带符号的大小都是提供范围[-127,127]的8位数字的表示。两者对 +0 和 -0 都有不同的表示。两者都已被(大部分)早期计算机系统使用。

带符号的幅度表示法可能是人类最容易想象的,并且可能出于与人们首先创建十进制计算机而不是二进制计算机的原因相同的原因使用它。

我想,曾经使用一个补码的唯一原因是因为早期计算机的创造者还没有考虑到二进制补码。后来,因为向后兼容。虽然,这只是我的推测,所以请三思而后行。

更多信息:https://en.wikipedia.org/wiki/Signed_number_representations

作为一个稍微相关的事实:在IEEE浮点表示中,带符号的指数使用excess-K表示,小数部分由带符号的幅度表示。

实际上不是-127到127。而是-127到-0和0到127。

早期处理器使用两种方法:

  1. 有符号大小:在这种情况下,否定答案是通过将 1 放在最高有效位来形成的。所以10000000和00000000都代表0

  2. 补一:只适用于不正数。这导致两个零表示:11111111 和 00000000.

另外两个补码几乎和其他两个一样古老。 https://www.linuxvoice.com/edsac-dennis-wheeler-and-the-cambridge-connection/