如果我有以下内容:
char v = 32; // 0010 0000
然后我做了:
v << 2
该数字为负数。 // 1000 0000 -128
我读了标准,但只写了:
如果E1具有带符号类型和非负值,则E1×2 E2为 在结果类型中可表示,那么这就是结果值; 否则,行为是未定的。
所以我不明白,如果有一个规则,如果有点在最左边的位 号码必须开始否定。
我正在使用GCC。
答案 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;