我在c中有一个小查询,我在数字69上使用按位左移,这是二进制的01000101
01000101 << 8
我的答案是100010100000000
不应该是全部8个零,即00000000
因为我们将所有8位向左移动然后用零填充。
这是因为数字( 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
位移操作符作用于整个对象,而不是单个字节。 如果存储对象69的对象宽度大于1字节(例如,int通常为4字节),则移位到第一字节溢出之外的位被“推入”第二字节。 例如:
00000000 00000000 00000000 01000101 //The number 69, stored in a 32 bit object 00000000 00000000 01010000 00000000 //shifted left by 8
如果您将数字存储在1字节变量(例如char)中,则结果确实为零。
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
如果将int移动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
以上就是c/c++开发分享所有8位的按位移位会发生什么相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544626.html