首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

CSAPP 2.16 習題解析:移位運算對單字節數值的影響

     編輯:關於C語言

CSAPP 2.16 習題解析

題目要求填寫表格,說明邏輯右移與算術右移對不同單字節數值的影響。假設字節為 8 位。

核心概念

  • 左移 (<<):低位補 0,高位丟棄。x << k 等價於 x * 2^k(模 256)。
  • 邏輯右移 (>>):高位補 0,低位丟棄。無符號數專用。
  • 算術右移 (>>):高位補符號位(即原最高位),低位丟棄。有符號數專用,保持負數符號。

完整計算表格

初始值 (Hex)二進制x << 3 (Hex)二進制邏輯右移 2 (Hex)二進制算術右移 2 (Hex)二進制
0xC31100 00110x180001 10000x300011 00000xF01111 0000
0x750111 01010xA81010 10000x1D0001 11010x1D0001 1101
0x871000 01110x380011 10000x210010 00010xE11110 0001
0x660110 01100x300011 00000x190001 10010x190001 1001

逐項驗證重點

0xC3 (1100 0011,有符號視為 -61)

  • 左移 3:1100 0011 << 3 = 0001 1000 (0x18)。高位 110 丟失。
  • 邏輯右移 2:補 0 → 0011 0000 (0x30)。
  • 算術右移 2:補符號位 1 → 1111 0000 (0xF0,即 -16)。

0x75 (0111 0101,正數)

  • 正數算術/邏輯右移結果相同:高位補 0。

0x87 (1000 0111,有符號視為 -121)

  • 算術右移 2:補 1 → 1110 0001 (0xE1,即 -31)。

0x66 (0110 0110,正數)

  • 同 0x75,兩種右移結果一致。

面試/考試陷阱提醒

  1. C 標準未強制規定有符號數右移為算術移位,但絕大多數編譯器(GCC, MSVC, Clang)均實現為算術右移。
  2. 無符號數右移必須為邏輯右移(補 0)。
  3. 左移操作對有符號/無符號數行為一致(補 0),但有符號數左移導致溢出屬於未定義行為(UB)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved