unsigned short A = 10; printf("~A = %u\n", ~A);

来源:互联网 发布:网络销售渠道有哪2种 编辑:程序博客网 时间:2024/06/15 04:10

unsigned short A = 10;

printf("~A = %u\n", ~A);

 

char c=128;

printf("c=%d\n",c);

  第一题,~A=0xfffffff5,int值 为-11,但输出的是uint。所以输出4294967285

第二题,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是128,所以输出-128。

这两道题都是在考察二进制向int或uint转换时的最高位处理。



在计算机系统中,数值一律用补码来表示(存储)。

 
正数的补码:与原码相同。 
  例如,+9的补码是00001001。 
负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 
  例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
  0000111按位取反为1111000;再加1,所以-7的补码是11111001。 

已知一个数的补码,求原码的操作分两种情况: 
  (1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。 
  (2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取
  反,然后再整个数加1。 

11111111 11111111 11111111 10000000 
因为符号位为1所以取反加1
10000000 00000000 00000000 01111111+1=
10000000 00000000 00000000 10000000
这就是-128的原码了~~~~
原创粉丝点击