源码 补码 反码
机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
真值:第一位是符号位,将带符号位的机器数对应的真正数值称为机器数的真值。
原码:原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制。
反码:正数的反码是其本身。负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
补码: 正数的补码就是其本身。负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
计算机内的所有值计算,均换成补码进行。
为什么使用补码:
(1)计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法。
负数的补码与对应正数的补码之间的转换可以用同一种方法——求补运算完成,可以简化硬件。可将减法变为加法,省去减法器。
无符号数及带符号数的加法运算可以用同一电路完成。
(2)使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127],
而使用补码表示的范围为[-128, 127].
(3)因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
补码的原理:使用了 “同余”的原理,即时钟往前拨(加法)和往回拨(减法),可以实现同样的计算结果。
signed 和 unsigned
c语言中,存在:
unsigned int /int
unsigned char /char
unsigned short /short
double (带符号的类型)
当一个无符号数和一个有符号数进行比较运算时,有符号数会被隐含的转换成无符号数,并假设这两个数都是非负数,然后进行比较运算。当把一个有符号数转换成无符号数时,其底层的二进制表示没有改变,仅仅是对其进行了不同的解释。
注意点:
(1) 当2个unsigned 的整数比较时,不能用相减判断,而是直接用 > 或 < 来判断
(2)位数小于int的提升到int,int之后都是从signed –> unsigned
(3)对于浮点数来说,浮点数(float,double)实际上都是有符号数,unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数根无符号数之间转化的问题了。
一定要记住如果需要使用有符号数时不要忘记强制转换。
if( x2>x1) printf(" x2-x1>0 x1:%d x2:%d x2-x1:%d x2-x1:%u \n",x1,x2,x2-x1,x2-x1 ); else printf("x2-x1<0 x1:%d x2:%d x2-x1:%d x2-x1:%u \n",x1,x2,x2-x1,x2-x1 ); if( (x2-x1) >0 ) printf(" x2-x1>0 x1:%d x2:%d x2-x1:%d x2-x1:%u \n",x1,x2,x2-x1,x2-x1 ); else printf("x2-x1<0 x1:%d x2:%d x2-x1:%d x2-x1:%u \n",x1,x2,x2-x1,x2-x1 );
运行结果
x2-x1<0 x1:99 x2:88 x2-x1:-11 x2-x1:4294967285 x2-x1>0 x1:99 x2:88 x2-x1:-11 x2-x1:4294967285
int a = -1; unsigned int b = 1; char x = -1; unsigned char y = 1; int m = -1; unsigned char n = -1; char t1 = -1; unsigned int t2 = -1; printf("a>b :%d\n", a > b); printf("x>y :%d\n",x>y ); printf("m>n :%d\n",m>n); printf("t1>t2: %d\n",t1>t2);
运行结果
a>b :1 /* a,b转成 unsigned int */ x>y :0 /* x,y 均被转成 int */ m>n :0 /*原因在于要把n提升为int就是255当然大于-1了,unsigned char 先提升为int,送入int的低八位中,高位全部补零 . 位数少的类型往位数多的类型转换 、*/ t1>t2: 0 /* t1转成 unsigned int 为0xffffffff,t2也是 0xffffffff ,比较应该是相等 */
参考
http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html