C语言中的移位操纵
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");
}
可以本身实践实践阿。