问题
I have a small query in c,
I am using the bitwise left shift on number 69 which is 01000101
in binary
01000101 << 8
and I get answer as 100010100000000
Shouldn't it be all 8 zeros i.e. 00000000
as we shift all the 8 bits to left and then pad with zeros.
回答1:
It is because of the literal (default data type) for a number (int
) is, in most of nowadays CPU, greater than 8-bit
(typically 32-bit
) and thus when you apply
69 << 8 //note 69 is int
It is actually applied like this
00000000 00000000 00000000 01000101 << 8
Thus you get the result
00000000 00000000 01000101 00000000
If you use, say, unsigned char
specifically, then it won't happen:
unsigned char a = 69 << 8; //resulting in 0
This is because though 69 << 8
itself will still result in
01000101 00000000
But the above value will be casted to 8-bit
unsigned char
, resulting in:
00000000
回答2:
Bit shift operators act on entire objects, not individual bytes. If the object storing 69 is wider than 1 byte (int is typically 4 bytes for example), then the bits that are shifted outside of the first (lowest/rightmost) byte overflow and are "pushed into" the second byte. For example:
00000000 00000000 00000000 01000101 //The number 69, stored in a 32 bit object
00000000 00000000 01010000 00000000 //shifted left by 8
If you had stored the number in a 1-byte variable, such as a char, the result would indeed have been zero.
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 object.
The same thing would happen if you shifted an int by 32.
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
来源:https://stackoverflow.com/questions/35615868/what-happens-with-bitwise-shift-for-all-8-bits