• <tr id='xqxl8'><strong id='xqxl8'></strong><small id='xqxl8'></small><button id='xqxl8'></button><li id='xqxl8'><noscript id='xqxl8'><big id='xqxl8'></big><dt id='xqxl8'></dt></noscript></li></tr><ol id='xqxl8'><table id='xqxl8'><blockquote id='xqxl8'><tbody id='xqxl8'></tbody></blockquote></table></ol><u id='xqxl8'></u><kbd id='xqxl8'><kbd id='xqxl8'></kbd></kbd>
  • <dl id='xqxl8'></dl>
    <span id='xqxl8'></span>

    <code id='xqxl8'><strong id='xqxl8'></strong></code>

    <ins id='xqxl8'></ins>

    <i id='xqxl8'><div id='xqxl8'><ins id='xqxl8'></ins></div></i>

    1. <i id='xqxl8'></i>
        <fieldset id='xqxl8'></fieldset>
      1. <acronym id='xqxl8'><em id='xqxl8'></em><td id='xqxl8'><div id='xqxl8'></div></td></acronym><address id='xqxl8'><big id='xqxl8'><big id='xqxl8'></big><legend id='xqxl8'></legend></big></address>

            Linux编程新手入门 C语言中的移位操作

            • 时间:
            • 浏览:1
            • 来源:124软件资讯网

              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 printf("%.2x", bp[i]);
              printf("\n");
              }


                可以自己实践实践阿 。