最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++有符號和無符號整數(shù)的位移操作過程

 更新時間:2025年09月18日 08:34:56   作者:MzKyle  
C++中位移操作對有符號與無符號整數(shù)處理不同:無符號左移補0,右移也補0;有符號右移補符號位(算術移位),左移可能觸發(fā)未定義行為,需注意類型轉換與跨平臺兼容性

在C++中,位移操作(左移<<和右移>>)是對整數(shù)二進制位的直接操作,但其行為在有符號整數(shù)(signed)無符號整數(shù)(unsigned) 中存在顯著差異。

這種差異源于計算機對整數(shù)的存儲方式(補碼)和語言標準對操作的規(guī)定,理解這些差異是編寫正確位運算代碼的關鍵。

一、位移操作的基本概念

位移操作的本質是將整數(shù)的二進制位向指定方向(左或右)移動指定的位數(shù),空出的位由特定規(guī)則填充。在C++中,位移操作符的語法為:

  • 左移:a << n 表示將a的二進制位向左移動n位,右側空出的位補0
  • 右移:a >> n 表示將a的二進制位向右移動n位,左側空出的位填充規(guī)則因整數(shù)是否有符號而不同。

需要注意的是:

  • 位移的位數(shù)n必須是非負整數(shù),且不能大于等于操作數(shù)的位數(shù)(如32位整數(shù)位移32位及以上屬于未定義行為);
  • 位移操作的結果類型與左操作數(shù)的類型一致(如int位移后仍為int)。

二、無符號整數(shù)(unsigned)的位移:邏輯移位

無符號整數(shù)的位移是邏輯移位(Logical Shift),即不考慮符號位,僅根據“空位補0”的規(guī)則處理,行為在C++標準中是完全明確的。

1. 無符號左移(unsigned << n)

左移時,二進制位整體向左移動n位,右側空出的n位全部補0,左側超出類型位數(shù)的高位被直接丟棄。

舉例:假設unsigned int為32位,分析unsigned int a = 0x0000000F(二進制00000000 00000000 00000000 00001111)的左移:

  • a << 1:左移1位后,右側補0,結果為0x0000001E(二進制00000000 00000000 00000000 00011110);
  • a << 4:左移4位后,右側補4個0,結果為0x000000F0(二進制00000000 00000000 00000000 11110000);
  • a << 28:左移28位后,高位超出32位的部分被丟棄,結果為0xF0000000(二進制11110000 00000000 00000000 00000000)。

規(guī)律:無符號左移n位等價于“a * 2^n”(若結果未超出類型范圍)。

2. 無符號右移(unsigned >> n)

右移時,二進制位整體向右移動n位,左側空出的n位全部補0,右側超出的n位被直接丟棄。

舉例:仍以32位unsigned int a = 0xF0000000(二進制11110000 00000000 00000000 00000000)為例:

  • a >> 1:右移1位后,左側補0,結果為0x78000000(二進制01111000 00000000 00000000 00000000);
  • a >> 4:右移4位后,左側補4個0,結果為0x0F000000(二進制00001111 00000000 00000000 00000000);
  • a >> 28:右移28位后,左側補28個0,結果為0x0000000F(二進制00000000 00000000 00000000 00001111)。

規(guī)律:無符號右移n位等價于“a / 2^n”(向下取整)。

三、有符號整數(shù)(signed)的位移:算術移位為主

有符號整數(shù)(如intlong long)在內存中以補碼形式存儲(最高位為符號位:0表示正數(shù),1表示負數(shù))。其位移行為與無符號不同,尤其是右移,C++標準將其定義為“實現(xiàn)定義”(implementation-defined),但主流編譯器(如GCC、Clang、MSVC)均采用算術移位(Arithmetic Shift)規(guī)則。

1. 有符號左移(signed << n)

有符號左移的行為與無符號左移基本一致:二進制位向左移動n位,右側空出的n位補0,左側超出類型位數(shù)的高位(包括符號位)被丟棄。

注意:若左移后符號位發(fā)生變化(如正數(shù)左移后符號位變?yōu)?),結果可能超出該類型能表示的范圍,此時屬于未定義行為(undefined behavior)。

舉例:32位int(范圍-2^31 ~ 2^31-1):

  • 正數(shù)左移:int a = 0x0000000F(15),a << 1 結果為0x0000001E(30),符號位仍為0(合法);
  • 負數(shù)左移:int b = -0x0000000F(-15,補碼0xFFFFFFF1),b << 1 結果為0xFFFFFFE2(-30),符號位仍為1(合法);
  • 未定義行為:int c = 0x40000000(1073741824),c << 1 結果為0x80000000(-2147483648),符號位從0變?yōu)?,屬于未定義行為(不同編譯器可能有差異)。

2. 有符號右移(signed >> n)

有符號右移是最容易產生差異的操作。主流編譯器采用算術移位:右側超出的n位被丟棄,左側空出的n位補符號位(正數(shù)補0,負數(shù)補1)。

這種規(guī)則的目的是保持位移后數(shù)值的“符號一致性”,尤其對負數(shù)而言,右移后仍為負數(shù)。

舉例1:正數(shù)右移
int a = 0x0000000F(15,二進制00000000 00000000 00000000 00001111):

  • 符號位為0,右移時左側補0;
  • a >> 1:結果為0x00000007(7,二進制00000000 00000000 00000000 00000111);
  • a >> 4:結果為0x00000000(0,二進制00000000 00000000 00000000 00000000)。

舉例2:負數(shù)右移
int b = -0x0000000F(-15,補碼0xFFFFFFF1,二進制11111111 11111111 11111111 11110001):

  • 符號位為1,右移時左側補1;
  • b >> 1:右移1位后,左側補1,結果為0xFFFFFFF8(-8,二進制11111111 11111111 11111111 11111000);
  • b >> 4:右移4位后,左側補4個1,結果為0xFFFFFFF0(-16,二進制11111111 11111111 11111111 11110000)。

規(guī)律:有符號右移n位對正數(shù)等價于“a / 2^n”(向零舍入);對負數(shù)等價于“a / 2^n”(向下取整,如-15 >> 1 = -8,而-15 / 2 = -7)。

四、有符號與無符號位移的核心差異對比

操作類型無符號整數(shù)(unsigned)有符號整數(shù)(signed)
左移(<<)邏輯移位,右側補0,高位丟棄邏輯移位(同無符號),但可能觸發(fā)未定義行為
右移(>>)=邏輯移位,左側補0,低位丟棄算術移位(主流編譯器),左側補符號位
符號影響無符號位,位移后仍為非負符號位不變(算術移位),負數(shù)位移后仍為負
應用場景位運算(如哈希、編碼)帶符號的數(shù)值計算(如除法近似)

五、實際開發(fā)中的注意事項

1.避免對有符號整數(shù)進行右移依賴

由于有符號右移是“實現(xiàn)定義”,若代碼需要跨編譯器兼容,應避免依賴其行為。如需邏輯右移,可先轉換為無符號類型(如(unsigned int)a >> n)。

2.負數(shù)轉換為無符號的妙用

如之前的toHex函數(shù)中,負數(shù)轉換為unsigned int后,右移變?yōu)檫壿嬕莆唬ǜ呶谎a0),可正常處理補碼的所有位,避免無限循環(huán)(若用有符號右移,負數(shù)會因補1而永遠不為0)。

3.警惕位移后的未定義行為

  • 位移位數(shù)為負或大于等于類型位數(shù)(如32位int移32位);
  • 有符號左移后符號位改變(超出表示范圍)。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Visual?Studio2022下Opencv的配置圖文教程

    Visual?Studio2022下Opencv的配置圖文教程

    本文主要介紹了Visual?Studio2022下Opencv的配置圖文教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • C語言實現(xiàn)BMP圖像開運算處理

    C語言實現(xiàn)BMP圖像開運算處理

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)BMP圖像開運算處理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 基于C++實現(xiàn)的線程休眠代碼

    基于C++實現(xiàn)的線程休眠代碼

    這篇文章主要介紹了基于C++實現(xiàn)的線程休眠代碼,包括了Linux平臺及基于boost庫的兩種實現(xiàn)方法,有不錯的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • 使用QGraphicsView實現(xiàn)氣泡聊天窗口+排雷功能

    使用QGraphicsView實現(xiàn)氣泡聊天窗口+排雷功能

    這篇文章主要介紹了使用QGraphicsView實現(xiàn)氣泡聊天窗口+排雷,重點給大家介紹使用QWebEngineView控件內嵌html+CSS的實現(xiàn)方式,需要的朋友可以參考下
    2022-04-04
  • MFC程序設計常用技巧匯總

    MFC程序設計常用技巧匯總

    這篇文章主要介紹了MFC程序設計常用技巧,實例匯總了MFC程序設計中常見的問題與解決方法,非常具有實用價值,需要的朋友可以參考下
    2015-05-05
  • C++學習之移動語義與智能指針詳解

    C++學習之移動語義與智能指針詳解

    智能指針和移動語義是迄今為止,最難理解的兩個概念,下面這篇文章主要給大家介紹了關于C++學習之移動語義與智能指針的相關資料,需要的朋友可以參考下
    2021-05-05
  • C++深入講解初始化列表的用法

    C++深入講解初始化列表的用法

    這篇文章主要介紹了C++成員初始化列表,除了可以使用構造函數(shù)對類成員進行初始化之外,C++還提供了另外一種初始化的方法,叫做成員初始化列表。下面來看看文章的詳細吧,需要的朋友可以參考一下
    2022-04-04
  • C++ 實現(xiàn)即時通信的示例代碼(直接運行)

    C++ 實現(xiàn)即時通信的示例代碼(直接運行)

    本文主要介紹了C++ 實現(xiàn)即時通信的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C++實現(xiàn)分水嶺算法(Watershed Algorithm)

    C++實現(xiàn)分水嶺算法(Watershed Algorithm)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)分水嶺算法Watershed Algorithm,具有一定的參考價值,感興趣的小伙伴們可以參考一 下
    2018-01-01
  • C++無法重載點符號、::、sizeof等的原因

    C++無法重載點符號、::、sizeof等的原因

    這篇文章主要介紹了C++無法重載點符號、::、sizeof等的原因的相關資料,需要的朋友可以參考下
    2016-05-05

最新評論

西华县| 宁乡县| 岗巴县| 祥云县| 山丹县| 耿马| 屯门区| 恩平市| 铜鼓县| 铁力市| 昌乐县| 灵川县| 石阡县| 江阴市| 司法| 攀枝花市| 弥渡县| 河池市| 和田市| 兴海县| 泸水县| 海原县| 武义县| 镶黄旗| 盘锦市| 丁青县| 道孚县| 枣强县| 怀仁县| 丰原市| 太仓市| 竹溪县| 汤原县| 闸北区| 大港区| 淮安市| 紫金县| 定西市| 当雄县| 固安县| 资兴市|