如果我有以下内容:
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