RISC-V 架构适配知识库
  • 睿迁工具集
  • RVSmartPorting
  • 简体中文
  • English (US)
在 Gitee 上查看
  • 睿迁工具集
  • RVSmartPorting
  • 简体中文
  • English (US)
在 Gitee 上查看
  • 简介
    • 贡献规范
  • 入门
    • 内存一致性模型
    • 硬件开发板差异
    • 指令集模块
  • 通用调整
    • 检查项目对多架构的支持性
    • 文件结构调整
    • 目录结构调整
    • 测试用例调整
  • C/C++ 程序
    • 内联汇编
    • 宏定义与判断
    • 移位运算中的整形常数
    • Intrinsic 函数
    • 多版本函数
    • 系统调用
  • 汇编程序
  • 编译配置文件
    • rpmbuild
    • Makefile
    • CMake
    • Autoconf
    • QMake
    • 其它
  • 其它编程语言
    • Rust
    • Go
    • Python
    • 其它语言
  • 辅助工具集
    • 目标代码定位工具
    • 汇编指令翻译工具

移位运算中的整形常数

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)。 若出现了对有符号整数的移位操作,需注意目标平台的行为是否与预期一致。

编辑本页面
最后更新时间:
贡献者: LightningRS
Prev
宏定义与判断
Next
Intrinsic 函数

本知识库采用 木兰开放作品许可协议 署名-相同方式共享 第1版 进行许可

版权所有 © 2025 RVSmartPorting. | 京ICP备20005262号 | beian京公网安备11010802043677号