假设我想将"-128"转换为二进制.
根据我的理解,我得到"128"的二进制表示,反转位然后加1.
所以128 = 10000000
所以"逆"是01111111
那么"01111111"+"1"="10000000"这是"-0"不是吗?
我的教科书让这看起来很容易,但我无法弄清楚我做错了什么.谢谢您的帮助.
不,这绝对是-128(无论如何都是两个补码,这是你在谈论否定数字时所说的).它仅-0用于负数的符号/幅度表示.
有关两个表示的详细信息以及C允许的第三个表示,请参阅此答案,一个补充,但我会从那里复制一个片段,以使此答案尽可能自包含.
要获得正数的负面表示,您:
您可以在下表中看到:
number | twos 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
Run Code Online (Sandbox Code Playgroud)
您应该知道8位二进制补码中没有128,最大值为127.
数字通过中点的地方是"聪明"的东西发生的地方:
00000000 -> 0
00000001 -> 1
: :
01111110 -> 126
01111111 -> 127
10000000 -> -128
10000001 -> -127
: :
11111110 -> -2
11111111 -> -1
Run Code Online (Sandbox Code Playgroud)
因为添加(例如)的位模式100和-18位环绕将自动神奇地给你99:
100+ 0 0110 0100
1- 0 1111 1111
===========
1 0110 0011 99+ (without that leading 1)
Run Code Online (Sandbox Code Playgroud)