所有8位的按位移位会发生什么

时间:2016-02-25 00:17:08

标签: c bitwise-operators bit-shift

我在c中有一个小查询, 我在数字69上使用按位左移,在二进制

中为01000101
01000101  << 8 

我的答案为100010100000000

不应该是全部8个零,即00000000,因为我们将所有8位向左移动然后用零填充。

2 个答案:

答案 0 :(得分:6)

由于数字(int)的文字(默认数据类型)在大多数现在的CPU中大于8-bit(通常是32-bit),因此当你申请

69 << 8 //note 69 is int

它实际上是这样应用的

00000000 00000000 00000000 01000101 << 8

因此你得到了结果

00000000 00000000 01000101 00000000

如果你专门使用unsigned char,那么它就不会发生:

unsigned char a = 69 << 8; //resulting in 0

这是因为虽然69 << 8本身仍将导致

01000101 00000000

但上述值会投放到8-bit unsigned char,从而产生:

00000000

答案 1 :(得分:3)

位移操作符作用于整个对象,而不是单个字节。如果存储69的对象宽于1个字节(例如,int通常为4个字节),那么在第一个字节溢出之外移位的位被&#34;推入&#34;第二个字节。例如:

           01000101 //The number 69, stored in an 8 bit object
(01000101) 00000000 //shifted left by 8
 ^^^^^^^^
these bits have been shifted outside the size of the variable

如果您已将数字存储在1字节变量(例如char)中,则结果确实为零。

00000000 00000000 00000000 01000101 //The number 69, stored in a 32 bit int
00000000 00000000 01010000 00000000 //shifted left by 8
00000000 01010000 00000000 00000000 //shifted left by 16
01010000 00000000 00000000 00000000 //shifted left by 24
00000000 00000000 00000000 00000000 //shifted left by 32, overflow

如果将int移动了32,也会发生同样的事情。

[Serializable]
public struct Pair<T, K> {

  public T First { get; private set; }
  public K Second { get; private set; }

  public Pair(T first, K second) {
    First = first;
    Second = second;
  }

  ...
}