无符号数
MAX+1->MIN MIN-1->MAX
无符号与有符号相加减
unsigned int i=5;
int j=-10;
if((i+j)<0)
printf("true\n");
else
printf("false\n");
结果:false
原因: 运算原则:无符号与有符号数进行计算,有符号数会看作无符号数,结果为无符号数
printf("%d\n",(i+j)) ;
result:-5
原因:%d将结果以有符号数显示(仅是显示的结果) %u显示无符号数的结果
移位运算
左移 (逻辑左移,即右边空位补0)
有符号数在内存中以补码形式存储,所以移动的话会移动符号位
0x1100 1001 << 2 --> 0x0010 0100
char c=-128;
printf("%d\n",c<<1);
c为-128,在内存中应该为11000 0000,最高位为符号位,由于char类型只占8位,所以应该是1000 0000,左移1位后按理应为0000 0000,但是结果为-256
原因:使用%d,打印按照int型打印,int型4字节,可以存放比超过8位的负数
修改代码如下
char c=-128;
c=c<<1;
printf("%d\n",c);
结果为0
右移(对于有符号的数是算术右移,即左边空位补符号位的数)
0x1100 1001 >> 2 --> 0x1111 0010
--------------------------------------------------------------------
17-3-8
移位的数必须为整数类型
char和short隐式转换为int后进行移位操作 |