左移算子

时间:2014-06-12 07:31:03

标签: c binary bit-manipulation bit-shift

如果我有以下内容:

char v = 32; // 0010 0000
然后我做了:

v << 2 

该数字为负数。 // 1000 0000 -128

我读了标准,但只写了:

  

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

所以我不明白,如果有一个规则,如果有点在最左边的位 号码必须开始否定。

我正在使用GCC。

3 个答案:

答案 0 :(得分:1)

char 等签名数据原语使用二进制补码(http://en.wikipedia.org/wiki/Twos_complement)来编码值。您可能正在寻找 unsigned char ,它不会使用二进制补码(无负数)对值进行编码。

答案 1 :(得分:1)

左移两次将给出1000 0000) 2 = 128) 10

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

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

答案 2 :(得分:0)

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

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