」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > ## 為什麼右移位運算子在大移位值時會表現出意外行為?

## 為什麼右移位運算子在大移位值時會表現出意外行為?

發佈於2024-11-04
瀏覽:829

## Why Does the Right Shift Operator Exhibit Unexpected Behavior with Large Shift Values?

右移運算子的有趣行為

右移運算子(>>) 在處理較大的右移值時表現出特殊的行為。考慮以下程序:

#include 
#include 

int foo(int a, int b)
{
   return a >> b;
}

int bar(uint64_t a, int b)
{
   return a >> b;
}

int main()
{
    std::cout > 32: " > 32) > (int)32: " > (int)32) 

foo(1, 32) 的預期輸出將為 0,但令人驚訝的是,它會傳回 1。這可以歸因於以下內容:

邏輯移位與算術運算Shift

在x86/x86-64 架構上,右移運算子實際上執行邏輯右移,這表示它用0 填滿空出的位,而不管左運算元的符號。此行為類似於使用>>> b.

編譯器優化

在foo(1, 32) 的情況下,值32 轉換為int,實際上被截斷為32 位元。由於 int 可以容納的最大值為 231-1,因此右移本質上是 >>> (32 % 32),其計算結果為 0。

Undefined行為

相關的 C 標準規定,對於計數大於或等於提升的左操作數寬度的右移,「行為未定義」。在這種情況下,1 >> 32 和 (int)1 >> (int)32 的計數都大於 32,導致不可預測的結果。

與 bar(1, 32)[ 的差異&&&&]

函數bar採用64位元無符號整數,保證其寬度大於32。因此,bar中的右移不受未定義行為的影響。

結論

處理大移位值時,右移運算子的行為變得不明確。在 x86/x86-64 架構上,執行邏輯右移,而在 ARM 上,可能會使用不同的實作。由於未定義的行為,在可移植程式碼中應避免計數大於或等於操作數寬度的右移結果。

最新教學 更多>
  • 如何使用 Go 的 pq 套件將資料從 STDIN 匯入到 PostgreSQL?
    如何使用 Go 的 pq 套件將資料從 STDIN 匯入到 PostgreSQL?
    如何將行從 STDIN 匯入到 Postgresql? [重複]在 Go 中,您可以使用 pq 套件將行從 STDIN 匯入到 PostgreSQL。以下是逐步解決方案:第 1 步:準備資料庫連線import ( "database/sql" "gith...
    程式設計 發佈於2024-11-17
  • 如何解決Python中類型提示的循環導入?
    如何解決Python中類型提示的循環導入?
    沒有循環導入的Python 中的類型提示在嘗試將一個大類分成兩個較小的類時,您會遇到循環問題進口。 “main”類別導入 mixin 類,並且 mixin 類別在其類型提示中引用“main”類別。這會導致導入循環,導致類型提示無法正常運作。 要解決此問題,可以考慮以下方法:# main.py fro...
    程式設計 發佈於2024-11-17
  • 什麼是 jQuery.fn?
    什麼是 jQuery.fn?
    深入研究 jQuery.fn:原型的別名在 jQuery 庫中,您可能會遇到神秘的 jQuery.fn。這個神秘的 fn 代表什麼以及它有什麼作用? Prototype 的角色在 JavaScript 領域,prototype 屬性是至關重要的組成部分建構子。當您使用特定建構函式建立實例時,該實例將...
    程式設計 發佈於2024-11-17
  • 如何用Python實現高效率的雙向雜湊表?
    如何用Python實現高效率的雙向雜湊表?
    實現高效的雙向哈希表雙向哈希表允許鍵到值和值到鍵的查找。雖然 Python 的內建 dict 資料結構在鍵到值查找方面表現出色,但它並不能提供有效的值到鍵檢索。 實現雙向雜湊表的有效方法是利用類別擴展了標準字典。此類別名為 bidict,維護一個逆目錄,該目錄會根據對常規 dict 的任何修改自動更...
    程式設計 發佈於2024-11-17
  • PDOStatement::bindParam() 中的前導冒號真的是可選的嗎?
    PDOStatement::bindParam() 中的前導冒號真的是可選的嗎?
    PDOStatement::bindParam() 中參數名稱的前導冒號是否真的可選? PDOStatement::bindParam() 允許您使用佔位符(例如:name)在查詢中指定命名參數。文件指出命名佔位符的參數標識符應使用格式:name。然而,據觀察,:name 和 name 似乎都可以使...
    程式設計 發佈於2024-11-17
  • 如何在 JavaScript 中實現穩定排序以在排序過程中保持元素順序?
    如何在 JavaScript 中實現穩定排序以在排序過程中保持元素順序?
    JavaScript中的穩定排序目標:基於鍵對物件陣列進行高效排序,保持一致性和穩定性。 演算法建議: 雖然有許多排序演算法,但為了滿足您對穩定性的特定需求,請考慮實作不穩定排序演算法的修改版本,例如 QuickSort 或 MergeSort。 穩定排序技術:為了確保穩定性,在排序比較功能中增加一...
    程式設計 發佈於2024-11-17
  • 掌握複合元件:建構靈活且可重複使用的 React 元件
    掌握複合元件:建構靈活且可重複使用的 React 元件
    介紹 React 世界中非常有用且全面的東西是它的設計模式,因為它們有助於保持程式碼的可擴展性並為我們創建的元件添加意義。 有多種模式,在本文中我們將討論複合組件,這是一種高級模式,對於創建靈活的複合介面特別有用。 什麼是複合組件? 複合元件是 React 中的...
    程式設計 發佈於2024-11-17
  • ## 雙波形符運算子 (~~) 在 JavaScript 中有何作用?
    ## 雙波形符運算子 (~~) 在 JavaScript 中有何作用?
    JavaScript 中的雙波號運算子(~~)在JavaScript 中,~~ 運算子是一個型別強制運算子,它會刪除後面的所有內容數字的小數點。這與 ~ 運算子不同,~ 運算子是位元 NOT 運算符,可反轉值的位元。 操作 運算子的工作原理是先將其值轉換為運算元為有符號 32 位元整數。這意味著即使...
    程式設計 發佈於2024-11-17
  • 如何在 Python 中執行模糊字串比較?
    如何在 Python 中執行模糊字串比較?
    Python 中的模糊字符串比較:有效模組在處理字符串中的潛在變化和錯誤時,需要進行模糊字符串比較。為這項任務找到合適的 Python 模組至關重要。這個問題尋求一個可以提供相似性百分比的模組,允許各種比較選項。 difflib: A Versatile Tool for Fuzzy Compar...
    程式設計 發佈於2024-11-17
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-11-17
  • 如何設定 Go 測試的工作目錄?
    如何設定 Go 測試的工作目錄?
    Go 測試中的工作目錄在 Go 中,通常將設定檔放置在工作目錄中並在程式碼中引用它們。但是,如果測試環境與生產環境不匹配,單元測試可能無法找到這些文件。 要為 Go 測試指定工作目錄,請探索以下解決方案:考慮使用執行時間套件中的 Caller 函數。呼叫者取得目前的測試來源檔案並返回其路徑。此路徑可...
    程式設計 發佈於2024-11-17
  • 如何轉義 PHP 正規表示式中的反斜線?
    如何轉義 PHP 正規表示式中的反斜線?
    在PHP 正規表示式中轉義反斜線要在PHP 正規表示式模式中轉義反斜線要在PHP 正規表示式模式中轉義反斜線,可以使用三個反斜線(\\ ) 或四個反斜線(\\\\)。雖然這兩個選項都會產生成功的匹配,但它們的解釋和用法有細微差別。 測試案例:// TEST 01: (3 backslashes) $...
    程式設計 發佈於2024-11-17
  • 如何在 Python 中用逗號連接字串:哪種方法最好?
    如何在 Python 中用逗號連接字串:哪種方法最好?
    用逗號連接字串:簡潔的解決方案要連接列表中的字串,在每對之間加上逗號,可以使用多種方法。一種流行的技術涉及將 ''.join() 函數與 lambda 函數 map() 結合使用。 以下方法示範了此技術:result = ','.join(map(lambda x: x ',',...
    程式設計 發佈於2024-11-17
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-17
  • 如何使用 Java 安全加密設定檔中的密碼?
    如何使用 Java 安全加密設定檔中的密碼?
    如何安全地加密設定檔中的密碼加密設定檔中儲存的密碼對於保護敏感資料和防止未經授權的存取至關重要。 使用Java中基於密碼的加密(PBE)加密和解密密碼的一種簡單有效的方法是利用Java 的基於密碼的加密 (PBE)。 PBE 允許您使用安全演算法從密碼中衍生金鑰,例如 PBKDF2WithHmacS...
    程式設計 發佈於2024-11-17

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3