What happens with bitwise shift for all 8 bits

强颜欢笑 提交于 2019-12-12 09:41:17

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!