首先,二进制只有0/1,这点至关重要,二进制本身不分正负,二进制有位宽限制,如果数字长度超过位宽则从左到右依次忽略直到等于位宽上限,数字的位宽是确定的,为了防止溢出,教程有些算法并不完全准确(没有严格按位宽)
二进制转换为十进制非常简单
这是一个二进制
1001110
现在,我们假设这是一个抽屉,抽屉有两行,抽屉每个格子都可以存放一位数字,现在,将1001110放进抽屉的第二行,然后,从抽屉的存放数字的最后一位格子,从右到左,依次给上行对应的格子添加一个数字,数字最初为0,但每往左一格,数字+1
所以,现在抽屉为
第一行: 6 5 4 3 2 1 0
第二行: 1 0 0 1 1 1 0
我们根据最下面的数字
如果这个数字是0,那么它也等于0
如果是1,设它上面的数字为x,那么它等于1*(2)的x次幂
然后将所有结果相加
第一行: 6 | 5 | 4 | 3 | 2 | 1 | 0 |
第二行: 1 | 0 | 0 | 1 | 1 | 1 | 0 |
结果是: 64|0 | 0 | 8 | 4 | 2 | 0 |
64+8+4+2 = 78
所以1001110二进制转十进制的结果是78
但是,这样无法表示负数
所以,我们可以把二进制第一位用来表示正负,然后通过公式重新变成二进制
如果第一位是0,那么无需解码,直接单作二进制来运算
如果第一位为1,那么将所有位数全部反转,如1001110反转就是
1 | 0 | 0 | 1 | 1 | 1 | 0 |
0 | 1 | 1 | 0 | 0 | 0 | 1 |
还需要在尾数+1
但是,二进制只能是0/1,所以逢2进1
所以结果是
0 1 1 0 0 1 0
0110010表示-50
所以,为了78能正确表达,补齐8位
01001110
我们需要将他反转
10110001
然后+1
10110010
然后重新计算,转为二进制
首位为1,视为负数
反转
01001101
然后+1
01001110
=-78
好的
现在
假设
这是32位宽整数上限
01111111111111111111111111111111(其实我少打了一个1)
然后根据+1
此时,应该是
01000000000000000000000000000000000
但是,因为超过32位,所以第一位忽略
所以实际变成负数!而且是最小数
所以,此时,他就是
10000000000000000000000000000000000
表示最小数
而很多游戏恰好使用32位整数,所以导致溢出
二进制转换为十进制非常简单
这是一个二进制
1001110
现在,我们假设这是一个抽屉,抽屉有两行,抽屉每个格子都可以存放一位数字,现在,将1001110放进抽屉的第二行,然后,从抽屉的存放数字的最后一位格子,从右到左,依次给上行对应的格子添加一个数字,数字最初为0,但每往左一格,数字+1
所以,现在抽屉为
第一行: 6 5 4 3 2 1 0
第二行: 1 0 0 1 1 1 0
我们根据最下面的数字
如果这个数字是0,那么它也等于0
如果是1,设它上面的数字为x,那么它等于1*(2)的x次幂
然后将所有结果相加
第一行: 6 | 5 | 4 | 3 | 2 | 1 | 0 |
第二行: 1 | 0 | 0 | 1 | 1 | 1 | 0 |
结果是: 64|0 | 0 | 8 | 4 | 2 | 0 |
64+8+4+2 = 78
所以1001110二进制转十进制的结果是78
但是,这样无法表示负数
所以,我们可以把二进制第一位用来表示正负,然后通过公式重新变成二进制
如果第一位是0,那么无需解码,直接单作二进制来运算
如果第一位为1,那么将所有位数全部反转,如1001110反转就是
1 | 0 | 0 | 1 | 1 | 1 | 0 |
0 | 1 | 1 | 0 | 0 | 0 | 1 |
还需要在尾数+1
但是,二进制只能是0/1,所以逢2进1
所以结果是
0 1 1 0 0 1 0
0110010表示-50
所以,为了78能正确表达,补齐8位
01001110
我们需要将他反转
10110001
然后+1
10110010
然后重新计算,转为二进制
首位为1,视为负数
反转
01001101
然后+1
01001110
=-78
好的
现在
假设
这是32位宽整数上限
01111111111111111111111111111111(其实我少打了一个1)
然后根据+1
此时,应该是
01000000000000000000000000000000000
但是,因为超过32位,所以第一位忽略
所以实际变成负数!而且是最小数
所以,此时,他就是
10000000000000000000000000000000000
表示最小数
而很多游戏恰好使用32位整数,所以导致溢出