c/c++语言开发共享左移算子

如果我有以下内容:

char v = 32; // 0010 0000 

然后我做:

 v << 2 

这个号码是负面的。 // 1000 0000 -128

我读了标准,但只写了:

如果E1具有带符号类型和非负值,并且E1×2 E2可在结果类型中表示,那么这就是结果值; 否则,行为是未定的。

所以我不明白,如果一个规则是,如果有一点在大多数左边的位上,那么这个数字必须从负数开始。

我正在使用GCC。

    左移两次将得到1000 0000) 2 = 128) 10

    如果128在char是可表示的,即你在某个机器(带有支持编译器)中提供大小> 8位的char ,那么128就是你得到的值(因为它可以在这种类型中表示)。

    否则,如果char的大小与最常见的机器一样只有8位,对于使用二进制补码表示负值的有符号字符类型,[-128,127]是可表示的范围。 你处于未定义的行为领域,因为它不能代表那种类型。

    char这样的签名数据原语使用二进制补码( )来编码值。 您可能正在寻找的是unsigned char ,它不会使用二进制补码(无负数)对值进行编码。

    尝试使用unsigned char代替char使用较少的位来表示你的角色,通过使用unsigned char,你可以使用更多的位来表示你的角色

     unsigned char var=32; v=var<<2; 

      以上就是c/c++开发分享左移算子相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

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

      ctvol管理联系方式QQ:251552304

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

      (0)
      上一篇 2020年12月11日
      下一篇 2020年12月11日

      精彩推荐