移位运算中的整形常数
C/C++ 中,移位运算的使用与硬件架构存在微妙的联系。具体来说,可分为以下两种情况:
基于移位运算的数据端序调整
在底层数据存储和网络数据传输中,会涉及数据的端序问题。常见的端序结构包括:
- 大端序(Big Endian):将高位字节保存在内存的低地址(高位字节在前)
- 小端序(Little Endian):将高位字节保存在内存的高地址(低位字节在前)
不同硬件架构下所采用的端序若有区别,则需要在处理数据时进行额外的端序转换。 其中,一些端序转换算法使用到了移位运算操作,其中偏移量会以整形常数的方式出现。
端序转换算法 1:
int changeEndian1(int data) {
int res;
char *p = (char *)&res;
p[0] = data >> 24;
p[1] = data >> 16;
p[2] = data >> 8;
p[3] = data;
return res;
}
端序转换算法 2:
int changeEndian2(int data) {
return ( (data >> 24) & 0xff ) |
( (data << 8) & 0xff0000 ) |
( (data >> 8) & 0xff00 ) |
( (data << 24) & 0xff000000 );
}
注意到,上述端序转换算法中都使用到了 包含整形常数的移位运算操作。
有符号整数的移位运算
对于有符号整数的右移操作,有些目标平台默认使用 算数右移(最高的符号位不变), 有些目标平台默认使用 逻辑右移(最高的符号位补 0)。 若出现了对有符号整数的移位操作,需注意目标平台的行为是否与预期一致。