左移算子

如果我有以下内容:

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这样的签名数据原语使用二进制补码( http://en.wikipedia.org/wiki/Twos_complement )来编码值。 您可能正在寻找的是unsigned char ,它不会使用二进制补码(无负数)对值进行编码。

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

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