你是要求-50的二进制补码?
1.首先将-50转换为16位二进制1000 0000 0011 0010,这你会吧。首位的1是符号位,表示负号。
2.然后,保持符号位不变,其他位求反,得到1111 1111 1100 1101。
3.求反后再在末位加1,得到1111 1111 1100 1110。
这就是-50的16位补码。
另外,负数赋值给无符号数其实就是将负数的补码原封不动的赋给无符号数,比如上面的-50的补码是1111 1111 1100 1110,将它赋给一个无符号数,那么这个无符号数的二进制表示就是1111 1111 1100 1110,但是这时候首位的1不再是符号位,因此,这个数转换为十进制就是65486。
具体C程序操作如下,你可以去尝试一下:
#include
int main()
{
short x=-50;
unsigned short y;
y=x;
printf("%u\n",y);
}
i = -50; //1111 1111 1100 1110,-50 的补码
j = -50; //1111 1111 1100 1110=65486,无符号数
//变量类型不同。 赋值,可以相同。
i = i / 2; //1 1111 1111 1100 111,-25 的补码
// i 是带符号变量,按照补码来操作,结果,仍然是负数。
j = j / 2; //0 1111 1111 1100 111=32743,无符号数
// j 是无符号变量,按照无符号数来操作,结果,是无符号数。
赋值时,都可以用“带符号数”来赋值,以补码,存入不同类型的变量。
除以 2 时,就分别按照不同类型,进行操作了。
这很正常,没毛病。