博客
关于我
C:位运算之 左移运算和右移运算
阅读量:204 次
发布时间:2019-02-28

本文共 796 字,大约阅读时间需要 2 分钟。

C语言中的位运算之左移与右移

在C语言中,位运算包括左移和右移两种基本操作。左移运算符<<和右移运算符>>,在处理有符号数和无符号数时,行为存在显著差异。

有符号数的左移与右移

对于有符号整数,左移和右移的操作方式与无符号数有所不同。以下是具体行为规则:

  • 左移运算(<<

    • 不论数值是正还是负,左移操作都直接丢弃最高位,并在低位补充相应数量的0。
    • 例如,假设有符号整数值为0x12345678,左移4位后结果为0x23456780
    • 如果数值为负数,例如0xFEDCBA98,左移4位后结果为0x0EDCBA98(需要补充4个0)。
  • 右移运算(>>

    • 有符号数的右移操作与左移不同,它会保留原来的符号位。
    • 右移时,直接丢弃最低位,并在高位补充相应数量的0。
    • 例如,负数0xFEDCBA98右移4位后结果为0xFFEDCBA9,高位补充的0并未改变符号位的值。
  • 无符号数的左移与右移

    无符号数的移位操作与有符号数不同,主要体现在以下几个方面:

  • 左移运算(<<

    • 左移直接丢弃最高位,并在低位补充相应数量的0。
    • 无论原始值的最高位是0还是1,左移后的结果都不会改变符号。
  • 右移运算(>>

    • 无符号数的右移操作总是补充0到高位。
    • 即使原始值的最高位是1,右移后高位也会被补充为0。
    • 例如,0xFEDCBA98右移4位后结果为0x0FEDCBA9
  • 左右移操作的对比

    通过以上分析可以看出,移位操作在有符号数和无符号数中的行为存在明显差异:

  • 无符号数

    • 右移时,高位总是补充0。
    • 左移时,高位会被丢弃,低位补充0。
  • 有符号数

    • 右移时,高位会被保留(即符号位不变)。
    • 左移时,高位会被丢弃,低位补充0。
  • 左移操作

    • 无论是有符号数还是无符号数,左移都丢弃最高位并补充0。
  • 这种差异说明,在处理移位操作时,必须明确处理的数值类型是有符号数还是无符号数。这对于编写高效且正确的位操作程序至关重要。

    转载地址:http://oxgs.baihongyu.com/

    你可能感兴趣的文章
    POI解析Excel【poi的坑——空行处理】
    查看>>
    POI:POI+JXL实现xls文件添加水印
    查看>>
    POI:POI实现docx文件添加水印
    查看>>
    POJ 1006
    查看>>
    Quartz中时间表达式的设置-----corn表达式
    查看>>
    poj 1035
    查看>>
    POJ 1061 青蛙的约会 (扩展欧几里得)
    查看>>
    Quartz2.2.1简单使用
    查看>>
    POJ 1080 Human Gene Functions(DP:LCS)
    查看>>
    Quant 开源项目教程
    查看>>
    POJ 1088 滑雪
    查看>>
    POJ 1095 Trees Made to Order
    查看>>
    POJ 1113 Wall(计算几何--凸包的周长)
    查看>>
    poj 1125Stockbroker Grapevine(最短路)
    查看>>
    Qualitor processVariavel.php 未授权命令注入漏洞复现(CVE-2023-47253)
    查看>>
    poj 1151 (未完成) 扫描线 线段树 离散化
    查看>>
    POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
    查看>>
    poj 1163 数塔
    查看>>
    POJ 1177 Picture(线段树:扫描线求轮廓周长)
    查看>>
    Qualitor checkAcesso.php 任意文件上传漏洞复现(CVE-2024-44849)
    查看>>