我在c中有一个小查询, 我在数字69上使用按位左移,在二进制
中为01000101
01000101 << 8
我的答案为100010100000000
不应该是全部8个零,即00000000
,因为我们将所有8位向左移动然后用零填充。
答案 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;
}
...
}