C语言中的左移与右移 – 京月飞鸿

先说左移,左推动优先位所有些人相当数,C中用<<运算符.譬如:

int i = 1;
i = i << 2;  //i值左移2

就是说,12进制是000…0001(1后面0int的位数关系到,32位机,gcc里有310),左移2后稍微 000…0100,就是10进制的4,因而左移1相当全部效果乘以2,于是左移n刚过去的外景乘以2n子方(用符号代表的总额未完成式相称。,因左移可能性动机用符号代表的改建。,上面的解说)

必要坚持到底的独一问题是int类型最左缘的用符号代表位和移使位移出去的健康状况.咱们意识到,int是塑料的的总额的记号。,最左缘的1位是用符号代表位。,01,这么移位的时辰就会涌现逃开,譬如:

int i = 0x40000000; //16进制的40000000,2进制的01000000…0000
i = i << 1;

这么,i在左移1于是刚过去的外景就会做0x80000000,就是2进制的100000…0000,表明位设置1,另一个的做切片都是0,做了int类型可以表现的最少的。,32位的int刚过去的值是-2147483648,逃开.假定再i左移1刚过去的外景产生了是什么??C在交谈中,摈弃最重要的外景的处置方式是采取的。,抛弃了1随后,iA的值0.

在特别健康状况下,左移位位数的最高的超越。,汇编者将运用左数字到最大位数O。,于是按残余物举行移位,:

int i = 1, j = 0x80000000; //int32
i = i << 33;   // 33 % 32 = 1
左移1,i2
j = j << 33;   // 33 % 32 = 1
左移1,j0,最重要的被抛弃

在用gcc波湾阴谋此顺序时,汇编者将赠送独一顺序。warning,说左移位数>=类型广大地域.因而确实i,j正推动的是1,就是33%32后的残余物.gcc其次是经常地。,现时另一个汇编者设想都是类似于的,现时还微暗。.

简而言之,左移是: 弃高位,0修补最底下的外景

再说右移,了解左移的犯罪行为,因而特定节日等用的仪式的机会是反而更的了解。.

右移位和左移相位的怀孕,它是把其中间的一部分分岔移到右方的。,运算符>>.

右移用符号代表外景和左移位,就带用符号代表积分的,譬如int类型,右移将记住用符号代表外景恒定。,譬如:

int i = 0x80000000;
i = i >> 1;  //i花费将不会改建0x40000000,它将做0xc0000000

就是说,用符号代表使位移到右方的。,正数的话补0,正数补码1,就是说,汇编交谈中间的算术右移。.并且,当推动的位数超越类型值的广大地域时。,会取残余物,于是推动另一个位.

     正数10100110 >>5(让的字长是8),咱们接纳它  11111101

简而言之,C,左移位是逻辑/算术左移(两相通),右移位是算术右移位,记住用符号代表位永恒的.在现实使用中,咱们可以依健康状况运用反面/做独一特定节日等用的仪式的举动紧的游览/除运算,这将巨大地高于圈子生产力。

参考资料: 

C交谈中间的移位巧妙地控制,质地不多。又有些分岔你不坚持到底,就忽略了。 

  前两做切片先。 

  (1)用符号代表 char x=3; 

  x<<1是多少?x>>1是多少? 

  (2)使具有特征 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,因而制造6x>>1把独一移到右方的,因它是独一无用符号代表数。,因而逻辑是特定节日等用的仪式的,右方的的独一是特定节日等用的仪式的,最左面的推动,做00000001,因而制造1

  (2)就用符号代表的总计3来说,x<<1向左推动,左流离转徙。,零填充物右方的的使位移。做00000110,因而制造6x>>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); 

  为(int i=0; i

       printf(%。2X, 英国石油公司[我]

  printf(\n)

}  

发表评论

Close Menu