求补码转换成原码函数
假设有一个补码 57345(十进制)-----0xE001 求一个函数能把他转换为10进制的原码
[解决办法]
unsigned short get(short x ) { short y ; y = x >> 15 ; return ((x^y)-y)|(y<<15);}输入是以x对应的二进制数.正数的补码是其本身,故上述代码对最高位为0的数,返回的不变.y始终为0.负数的补码是数值位取反再加1,换句话说,就是把绝对值求出来再把最高位补上(返回的是以unsigned short的形式,实际上就是abs(x)+32768).由于要保符号故y对应的二进制就是1111111111111111x^y就相当于取反,再减去y,由于是有符号的,就是加上1,负数:取反加1就是其绝对值.再通过或上y<<15把最高位置1.(其它办法或上也行)例:原 反 补-47 10101111 11010000 11010001输入是11010001对这个二进制位对应的数,由于计算机的补码表示,实际输入就是-47.y = x >> 15;结果是-1x^y = 00101110再减去y00101111最后或上1000000010101111(上面的只是八位的为例,自己看作16位的)得到原码,并且存放在unsigned short里正数很简单...y是零了,都没变通过这个程序如果没有|(y<<15)返回类型为short就成为用位操作求整数的绝对值的程序了.