先看下面一段代码:
#include <stdio.h>
int main(int argc , char *argv[])
{
unsigned short int i = 0 ;
unsigned char ii = 255 ;
int j = 8,p,q ;
p = j << 1 ;
q = j >> 1 ;
i = i - 1 ;
ii = ii + 1 ;
printf("i = %d\n",i) ;
printf("ii = %d\n",ii) ;
printf("p = %d\n",p) ;
printf("q = %d\n",q) ;
return 0 ;
}
上述代码中,变量i是一个unsigned short int类型,在32位平台下大小是2个字节,因此其无符号类型的大小范围为0~65535,。i赋值之后为0,内存中的数据为0x0000,。当执行了i = i - 1 ;之后,内存中的数据变为0xffff,所以结果就是65535。
变量ii是一个unsigned short char类型,大小是1个字节,因此其无符号类型的大小范围为0~255,。ii赋值之后为255,内存中的数据为0xff。当执行了ii = ii + 1 ;之后,内存中的数据变为0x00,所以结果就是0.
左移操作<<相当于乘法操作,>>n相当于乘以2^n。右移操作相当于除法操作,>>n相当于除以2^n。因此,对与变量p和q的输出分别是16和4.
通过以上分析可以看出,对于无符号结果的问题,我们需要十分清楚数据在内存中的大小以及其表达形式。另外,我们需要知道移位操作是最有效率的(可以代替乘除法),因此在嵌入式系统编程或者其他许多需要高效率的地方能够得到运用。
下面是程序运行出的结果:
1 i = 65535
2 ii = 0
3 p = 16
4 q = 4