参考链接:
https://blog.csdn.net/zgcjaxj/article/details/105920062
https://blog.csdn.net/hengshan/article/details/6440549
一、概述
逻辑左移和算术左移,都是在右边补0,效果一样。左移1bit,相当于原数 乘以2。
逻辑右移:右移后,左边补0
算术右移:右移后,左边补符号位,添加的位与原数的符号位相同,正数(0算作正数的一个)补0,负数补1。算术右移1bit,相当于原数 除以2。
C/C++中,对于无符号数,可以认为是逻辑左移和逻辑右移。对于有符号数,可以认为是算术左移和算术右移,
要对一个有符号数 执行逻辑右移,可以先将它强制类型转换为无符号类型。
要对一个无符号数 执行算术右移,可以先将它强制类型转换为有符号类型。
二、说明
-
逻辑/算数 左移
-
逻辑右移/正数右移
-
负数右移
三、实例
#include <iostream>
using namespace std;
typedef signed char s8;
typedef unsigned char u8;
//typedef unsigned int u8;
typedef unsigned short u16;
typedef signed short s16 ;
typedef unsigned int u32;
typedef signed int s32;
typedef signed __int64 s64;
typedef unsigned __int64 u64;
int main(void)
{
u8 aucData[1+4+8] = {0};
u32 ulCanID = 0x21345678;
aucData[1] = (u8)(ulCanID >> 24); // 右移24位变成0x00000021,强制u8保留0x21,对应的ASCII码 !
aucData[2] = (u8)(ulCanID >> 16); // 右移16位变成0x00002134,强制u8保留0x34,对应的ASCII码 4
aucData[3] = (u8)(ulCanID >> 8); // 右移8位变成0x00123456,强制u8保留0x56,对应ASCII码 V
aucData[4] = (u8)(ulCanID >> 0); // 0x12345678,强制u8保留0x78,对应ASCII码 x
cout << "aucData[1] = " << aucData[1] << endl;
cout << "aucData[2] = " << aucData[2] << endl;
cout << "aucData[3] = " << aucData[3] << endl;
cout << "aucData[4] = " << aucData[4] << endl;
return 0;
}
运行结果