当前位置:天才代写 > tutorial > C语言/C++ 教程 > C语言中的移位操纵

C语言中的移位操纵

2017-11-02 08:00 星期四 所属: C语言/C++ 教程 浏览:63

C语言中的移位操纵,内容不多。不外有些处所你不留意,就疏忽了。

先做两个小题先。

(1)unsigned char x=3;

x<<1是几多?x>>1是几多?

(2)char x=3;

x<<1是几多?x>>1是几多?

(3)char x=-3;

x<<1是几多?x>>1是几多?

3写成二进制数是00000011;-3写成二进制数是(补码)11111101。

措施执行的时候,操纵的是数值的编码暗示,也就是数值在内存中的二进制暗示。好比说,措施取-3的时候,就去取11111101。

(1)对无标记数3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。酿成00000110,所以功效是6;x>>1往右边移一位,由于是无标记数,所以逻辑右移,最右边一位移掉,最左边移进来的位补零,酿成00000001,所以功效是1。

(2)对付有标记数3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。酿成00000110,所以功效是6;x>>1往右边移一位,由于是有标记数,大概产生逻辑右移,也大概产生算术右移,这一点,C尺度并没有明晰地指定是利用逻辑右移照旧算术右移。但大大都的呆板都利用算术右移,酿成00000001,所以功效照旧1。可是请留意,这只是说大大都的呆板是这样的,你敢担保本身不会遇到非凡环境吗?

(3)对付有标记数-3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。酿成11111010,功效是-6。往右移一位,由于是有标记数,大概产生逻辑右移,也大概产生算术右移。大大都呆板利用算术右移,酿成11111110,功效是-2。

总结:左移时老是移位和补零。右移时无标记数是移位和补零,此时称为逻辑右移;而有标记数大大都环境下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。

附打印内存中字节编码的代码:

void print_char(char x)
{
 unsigned char * bp=(unsigned char *)&x;
 int size=sizeof(x);
 for(int i=0; i<size; i++)
    printf("%.2x", bp[i]);
 printf("\n");
}

可以本身实践实践阿。

 

    关键字:


天才代写-代写联系方式