在转两张讲相关话题的两张贴
在修改游戏过程中,大家可能会产生一点疑问,一字节数据可表示的范围是0--255,那么负数又怎么表示呢?原来在计算机中是这样规定的,用一个数的最高一位表示正负,0为正,1为负.如0111,1111转换为十进制为127,1111,1111为-127,由此我们知一字节的范围为-127--127,其他字节的范围类推.
上面讲的都是原码表示法,可在计算机中的数据都是以补码存放的,只有这样才能减轻cpu的负担.提到补码,就不得不提反码了.计算机中是这样规定反码的,如果是正数,则按原码形式不变,如127仍为0111,1111;而如果为负数则,第一位为1,其他各位取反(即0变为1,1变为0),如原码-127(1111,1111),表示为1000,0000.
补码同上,如果是正数,则按原码形式不变,如127仍为0111,1111;如果为负数则除第一位为1外,其他各位取反加1,如-127,先取反为1000,0000,然后加1,为1000,0001.但1000,0000比较特殊,用它来表示-128,由此我们知补码可表示的范围是-128--127。
上面这种方法是我们通用的。
下面这种方法,我们通常不用,讲这种方法的书也不多,电子科大出版的《脉冲与数字电路-何绪凡 》里有讲。
原码、反码、补码的定义
1、原码的定义
①小数原码的定义
[X]原 =[X 0≤X <1
[1- X -1 < X ≤ 0
例如: X=+0.1011 , [X]原= 01011
X=-0.1011 [X]原= 11011
②整数原码的定义
[X]原 =[X 0≤X <2n
[ 2n-X - 2n < X ≤ 0
2、补码的定义
①小数补码的定义
[X]补 =[X 0≤X <1
[2+ X -1 ≤ X < 0
例如: X=+0.1011, [X]补= 01011
X=-0.1011, [X]补= 10101
②整数补码的定义
[X]补 =[X 0≤X <2n
[2n+1+X - 2n ≤ X < 0
3、反码的定义
①小数反码的定义
[X]反 =[ X 0≤X <1
[2-2n-1-X -1 <X ≤ 0
例如: X=+0.1011 [X]反= 01011
X=-0.1011 [X]反= 10100
②整数反码的定义
[X]反 =[ X 0≤X <2n
[2n+1-1-X - 2n < X ≤ 0
4.移码:移码只用于表示浮点数的阶码,所以只用于整数。
①移码的定义:设由1位符号位和n位数值位组成的阶码,则 [X]移=2n + X -2n≤X ≤ 2n
例如: X=+1011 [X]移=11011 符号位“1”表示正号
X=-1011 [X]移=00101 符号位“0”表示负号
②移码与补码的关系: [X]移与[X]补的关系是符号位互为反码,
例如: X=+1011 [X]移=11011 [X]补=01011
X=-1011 [X]移=00101 [X]补=10101
③移码运算应注意的问题:
◎对移码运算的结果需要加以修正,修正量为2n ,即对结果的符号位取反后才是移码形式的正确结果。
◎移码表示中,0有唯一的编码——1000…00,当出现000…00时(表示-2n),属于浮点数下溢。