c/c++语言开发共享所有8位的按位移位会发生什么

我在c中有一个小查询,我在数字69上使用按位左移,这是二进制的01000101

 01000101 << 8 

我的答案是100010100000000

不应该是全部8个零,即00000000因为我们将所有8位向左移动然后用零填充。

    这是因为数字( int )的文字(默认数据类型)在大多数现在的CPU中大于8-bit (通常是32-bit ),因此当你申请时

     69 << 8 //note 69 is int 

    它实际上是这样应用的

     00000000 00000000 00000000 01000101 << 8 

    这样你就得到了结果

     00000000 00000000 01000101 00000000 

    如果你特意使用unsigned char ,那么它就不会发生:

     unsigned char a = 69 << 8; //resulting in 0 

    这是因为虽然69 << 8本身仍将导致

     01000101 00000000 

    但是上面的值将被转换为8-bit unsigned char ,从而导致:

     00000000 

    位移操作符作用于整个对象,而不是单个字节。 如果存储对象69的对象宽度大于1字节(例如,int通常为4字节),则移位到第一字节溢出之外的位被“推入”第二字节。 例如:

     00000000 00000000 00000000 01000101 //The number 69, stored in a 32 bit object 00000000 00000000 01010000 00000000 //shifted left by 8 

    如果您将数字存储在1字节变量(例如char)中,则结果确实为零。

      01000101 //The number 69, stored in an 8 bit object (01000101) 00000000 //shifted left by 8 ^^^^^^^^ these bits have been shifted outside the size of the variable 

    如果将int移动32,则会发生同样的事情。

     00000000 00000000 00000000 01000101 //The number 69, stored in a 32 bit int 00000000 00000000 01010000 00000000 //shifted left by 8 00000000 01010000 00000000 00000000 //shifted left by 16 01010000 00000000 00000000 00000000 //shifted left by 24 00000000 00000000 00000000 00000000 //shifted left by 32, overflow 

      以上就是c/c++开发分享所有8位的按位移位会发生什么相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/544626.html

      (0)
      上一篇 2021年1月9日
      下一篇 2021年1月9日

      精彩推荐