C语言如何表示负整数?
是使用二进制补码表示还是使用最高位(MSB)来表示?
十六进制中的-1
是ffffffff
。
请给我解析一下。
C语言如何表示负整数?
是使用二进制补码表示还是使用最高位(MSB)来表示?
十六进制中的-1
是ffffffff
。
请给我解析一下。
ISO C(在本例中为C99第6.2.6.2/2节,但它延续到标准的后续版本(a))规定实现必须选择三种不同的整数数据类型表示方式之一:二进制补码、反码或原码(尽管二进制补码实现远远超过其他实现的可能性极大)。
在所有这些表示中,正数是相同的,唯一的区别在于负数。
要获得正数的负表示形式,您需要执行以下操作:
您可以在下表中看到:
number | two's complement | ones' complement | sign/magnitude =======|=====================|=====================|==================== 5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 -5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101
+---------+-----------+--------+-----------+
| sign(1) | value(23) | pad(1) | value(23) |
+---------+-----------+--------+-----------+
\____________________/ \___________________/
upper word lower word
(a) 有趣的是,鉴于现代实现很少使用其他两种方法,人们一直在推动接受二进制补码作为唯一的方法。这在C++标准中已经取得了相当大的进展(WG21是负责此项工作的工作组),现在似乎也正在考虑应用于C语言中(由WG14负责)。
C语言可以使用有符号整数的补码、反码和原码表示方法。大多数典型的硬件使用二进制补码表示整数,使用符号/大小表示法表示浮点数(还有一种可能是使用“偏置”表示浮点数指数)。
0000 1010
+1111 1010
---------
[1]0000 0100 = 4 (decimal)
[1]代表了被舍弃的进位位。再来看一个例子:10 - 11 == 10 + (-11)。
0000 1010
+1111 0101
---------
1111 1111 = -1 (decimal)
对于整数类型,通常是二进制补码(实现特定)。对于浮点数,有一个符号位。
(uint8_t*)intptr
。 - Joop Eggen