我正在学习计算机系统课程并且已经挣扎,部分地,与二进制补码 http://en.wikipedia.org/wiki/Two%27s_complement。我想理解它,但我读过的所有内容都没有为我提供完整的图片。我读过维基百科文章 http://en.wikipedia.org/wiki/Two%27s_complement以及其他各种文章,包括我的教科书 https://rads.stackoverflow.com/amzn/click/com/013034074X.
什么是二进制补码,我们如何使用它以及它如何在强制转换(从有符号到无符号,反之亦然)、按位运算和移位运算等操作中影响数字?
二进制补码 https://en.wikipedia.org/wiki/Two%27s_complement是一种存储整数的巧妙方法,因此常见的数学问题很容易实现。
要理解,您必须考虑其中的数字binary https://en.wikipedia.org/wiki/Binary_number.
它基本上说,
- 对于零,请使用全 0。
- for positive integers, start counting up, with a maximum of 2(number of bits - 1)-1.
- 对于负整数,做完全相同的事情,但交换 0 和 1 的角色并倒数(因此不是从 0000 开始,而是从 1111 开始 - 这是“补数”部分)。
让我们用 4 位的迷你字节来尝试一下(我们将其称为nibble http://en.wikipedia.org/wiki/Nibble- 1/2 个字节)。
-
0000
- zero
-
0001
- one
-
0010
- two
-
0011
- three
-
0100
to 0111
- 四到七
That's as far as we can go in positives. 23-1 = 7.
对于底片:
-
1111
- 负一
-
1110
- 负二
-
1101
- 负三
-
1100
to 1000
- 负四到负八
请注意,您会获得负数的一个额外值(1000
= -8) 你不喜欢积极的一面。这是因为0000
用于零。这可以被认为是数轴 https://en.wikipedia.org/wiki/Number_line计算机。
区分正数和负数
这样做,第一位就扮演了“符号”位的角色,因为它可以用来区分非负十进制值和负十进制值。如果最高有效位是1
,那么二进制可以说是负数,就好像最高有效位(最左边)是0
,你可以说小数值是非负的。
“符号大小” https://en.wikipedia.org/wiki/Signed_number_representations#Signed_magnitude_representation负数只是将正数的符号位翻转,但这种方法必须处理解释1000
(one 1
紧随其后的是所有0
s) 为“负零”,这令人困惑。
“一个的补语” https://en.wikipedia.org/wiki/Ones%27_complement负数只是其正数的位补,这也导致了令人困惑的“负零”1111
(所有)。
除非您的工作非常接近硬件,否则您可能不必处理补码或符号数值整数表示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)