」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼 C++ 中的右移位運算子 (`>>`) 在移位 32 位元時會產生意外結果?

為什麼 C++ 中的右移位運算子 (`>>`) 在移位 32 位元時會產生意外結果?

發佈於2024-11-01
瀏覽:374

C 中的

Why does the right shift operator (`>>`) 在移位 32 位元時會產生意外結果?
C 中的 >`) 在移位 32 位元時會產生意外結果? " />

右移運算子的意外行為(1 >> 32)

在程式設計領域,通常使用右移運算子(>>)執行按位元運算,特別是將整數除以2 的冪。 int a。 返回a>>b; } int bar(uint64_t a, int b) { 返回a>>b; } int main() { std::cout > 32: " > 32) > (int)32: " > (int)32)

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): 1 // Should be 0
欄(1, 32): 0
1>>32:0
(int)1 >> (int)32: 0

這些結果背後的基本原理在於 CPU 和編譯器的內部運作原理。
foo(1, 32): 1 // Should be 0
bar(1, 32): 0
1 >> 32: 0
(int)1 >> (int)32: 0

foo() 函數的行為

在foo()函數中,移位操作是在沒有強制轉換的情況下執行的,導致CPU執行邏輯右移。在許多架構上,邏輯右移被實作為 a >> (b % 32),有效地忽略 b 的高位。因此,foo(1, 32) 結果為 1 >> (32 % 32),其計算結果為 1 >> 0,產生 1。

為什麼轉換為 64 位元整數很重要?

在bar()函數中,提供了一個64位元無符號整數,確保結果保證為0,因為b(32)小於運算元中的位數(64 )。然而,當 b 更改為 64 時,結果變得不可預測,並且可能仍會產生 1。

編譯器最佳化

在 1 >> 32 且 (int )1 >> (int)32,編譯器在編譯時最佳化這些常數表達式。此標準指定了右移的未定義行為,其中計數為負數或大於或等於操作數的長度。由於 32 超出了操作數的長度,編譯器無法確定結果並輸出 0 作為安全後備。

CPU-Specific Behavior

右移的實現不同 CPU 的操作可能有所不同。在 x86/x86-64 架構上,邏輯右移其實是 a >> (b % 32 或 64),取決於模式。然而,在 ARM 處理器上,右移運算保證大於或等於 32 的移位為零。

結論

使用右移運算子時,這一點至關重要考慮潛在的未定義行為,特別是當移位計數超過操作數的長度時。轉換為更廣泛的整數類型(例如 64 位元整數)可以確保不同 CPU 和編譯器之間的結果一致。

最新教學 更多>
  • 如何處理MySQL表名中的特殊字元?
    如何處理MySQL表名中的特殊字元?
    處理MySQL表名中的特殊字符MySQL將某些字符保留為特殊字符,這些字符在不經意使用時可能會與表名發生衝突。在給定的場景中,表名「e!」中的感嘆號 (!)資料插入時發生錯誤。 為了解決這個問題,MySQL 允許在使用特殊字元時用反引號 (`) 將表名括起來。這有效地“轉義”了特殊字符,並允許將其識...
    程式設計 發佈於2024-11-08
  • 了解 JVM 鎖優化
    了解 JVM 鎖優化
    并发对于开发可以执行多个并发操作的健壮、可扩展的应用程序非常关键。然而,为此需要付出同步方面的代价。由于获取和释放锁的随之而来的开销,它会产生性能成本。为了减轻这些性能成本,JVM 中融入了多种优化,例如偏向锁定、锁定消除、锁定粗化以及轻量级和重量级锁定的概念。 在本文中,我们将更详细地了解这些优化...
    程式設計 發佈於2024-11-08
  • 測試驅動開發 (TDD):嚴格的軟體開發方法
    測試驅動開發 (TDD):嚴格的軟體開發方法
    定義 TDD 測試驅動開發(TDD)是一種軟體開發方法,強調在編寫生產程式碼之前編寫測試。這是一種嚴格的方法,透過測試推動開發,有助於確保高品質的程式碼。 理解 TDD TDD 是一個循環過程,涉及三個關鍵步驟: 紅色:編寫定義程式碼所需行為的失敗測試。此步驟有助於澄清需求並確保測試集中於期望...
    程式設計 發佈於2024-11-08
  • 介面
    介面
    在物件導向程式設計中,定義類別應該做什麼是有用的,但定義類別應該做什麼是有用的。 抽象方法定義了方法的簽章而不提供實現,子類別必須實作該方法。 Java 中的介面可讓您將應該做什麼的定義與如何做的實作完全分開。 介面可以指定沒有主體的方法,該方法必須由類別實作。 實作一個介面的類別的數量沒...
    程式設計 發佈於2024-11-08
  • 在GoClipse中調試Go程式時如何避免進入彙編程式碼?
    在GoClipse中調試Go程式時如何避免進入彙編程式碼?
    使用彙編程式碼在GoClipse 中偵錯Go 程式嘗試在GoClipse 中除錯Go 程式時,使用者可能會遇到偵錯器無法正常運行的問題單步執行彙編程式碼而不是Go 程式碼。儘管正確安裝了 gdb 進行調試,但還是會發生這種情況。 設定斷點並透過 Eclipse 偵錯器執行程式時,它會輸入「rt0_d...
    程式設計 發佈於2024-11-08
  • 在 JavaScript 產生數字範圍
    在 JavaScript 產生數字範圍
    產生一個整數數組,並用從起始數字開始到結束數字結束的連續值填入該數組。 解決方案 function range(start, end) { const rangeArray = Array.from( {length: Math.ceil(end - start 1...
    程式設計 發佈於2024-11-08
  • 為什麼我的 PHP Curl 腳本中會出現「CURL 錯誤:接收失敗:連線由對等方重置」錯誤?
    為什麼我的 PHP Curl 腳本中會出現「CURL 錯誤:接收失敗:連線由對等方重置」錯誤?
    CURL ERROR: Recv failure: Connection Reset by Peer - PHP Curl遇到「CURL ERROR: Recv failure: Connection Reset by PHP Curl 中的「peer」錯誤可能會令人困惑。 1. TCP/IP 問題...
    程式設計 發佈於2024-11-08
  • 如何使用 SimpleDateFormat 解析帶有「Z」文字的日期?
    如何使用 SimpleDateFormat 解析帶有「Z」文字的日期?
    在 SimpleDateFormat 日期解析中處理 'Z' 文字在日期解析領域,'Z' 文字具有特殊的意義。它用作指示指定時間使用 UTC 作為參考點的標記。然而,使用 SimpleDateFormat 解析帶有此文字的日期可能會對某些特定模式帶來挑戰。 如您所遇到...
    程式設計 發佈於2024-11-08
  • 檢索表單輸入時如何處理空 $_POST 值
    檢索表單輸入時如何處理空 $_POST 值
    檢查$_POST 空值透過$_POST 從表單檢索使用者輸入時,驗證該值是否為空至關重要空或為空。否則可能會導致意外行為或安全漏洞。 在提供的程式碼中,條件 if(!isset($_POST['userName'])) 檢查 'userName' 鍵是否存在於$_PO...
    程式設計 發佈於2024-11-08
  • 狀態與道具:掌握 React Native 應用程式中的資料流
    狀態與道具:掌握 React Native 應用程式中的資料流
    如果您是 React Native 或 React 新手,您一定会遇到过“state”和“props”这两个词。了解这两者对于开发动态且适应性强的移动应用程序至关重要。我们将在这篇博客文章中深入探讨 state 和 props,检查它们的差异,并学习如何有效处理 React Native 应用程序中...
    程式設計 發佈於2024-11-08
  • 即時 API 設計:Node.js 最佳實務(指南)
    即時 API 設計:Node.js 最佳實務(指南)
    Node.js 因其事件驱动架构和非阻塞 I/O 模型而成为构建实时 API 的流行选择。 根据最新的使用统计数据,全球有超过 1500 万开发者在使用 Node.js,其中 67% 的企业报告成功采用了该技术。 使用 Node.js 构建的实时 API 为各种应用程序提供支持,从实时聊天和协作工具...
    程式設計 發佈於2024-11-08
  • 使用 Kubernetes、Helm 和 Ingress 部署監控堆疊
    使用 Kubernetes、Helm 和 Ingress 部署監控堆疊
    觀察和管理 Kubernetes 叢集的效能對於維護應用程式運作狀況、識別問題和確保高可用性至關重要。我將引導您使用 kubectl 和 Helm 設定全面的監控解決方案,將 Grafana、Loki 和 Prometheus 部署到叢集,以及設定 Ingress 以進行外部存取。 我們將介紹以下...
    程式設計 發佈於2024-11-08
  • 使用 Unity 建立擴增實境應用程式
    使用 Unity 建立擴增實境應用程式
    介紹 隨著智慧型手機的興起和 3D 圖形的進步,擴增實境 (AR) 近年來已成為一項流行技術。它允許用戶與現實世界中的數位元素交互,創造身臨其境的、引人入勝的體驗。 Unity 是創建 AR 應用程式最強大的工具之一,它是一種廣泛應用於遊戲產業的遊戲引擎。在本文中,我們將探討使用 ...
    程式設計 發佈於2024-11-08
  • JavaScript 如何提供原生 JSON 解析和序列化?
    JavaScript 如何提供原生 JSON 解析和序列化?
    瀏覽器原生JSON 解析與序列化瀏覽器原生JSON 解析與序列化window.JSON 物件在現代瀏覽器中提供原生JSON 支持,包括Internet Explorer 8 、 Firefox 3.1、Safari 4 和Chrome 3。該物件公開兩個方法:JSON.parse(str)解析 JS...
    程式設計 發佈於2024-11-08
  • 使用 STMMCU 實現靜電除塵器控制器的 SPWM ase/ase 逆變器
    使用 STMMCU 實現靜電除塵器控制器的 SPWM ase/ase 逆變器
    前段時間提到中頻電除塵器控制器,我仔細分析了單相和三相SPWM驅動時間,完成了STM32F103處理器上SPWM程式碼的編寫,並用示波器測試了訊號和波形,邏輯分析儀。 STM32F103的TIMER1和TIMER2支援互補的PWM輸出,我選擇TIMER1的CH1、CH2、CH3用於A、B、C三相驅...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3