深入理解 x86 匯編中的符號擴展指令:從 CBW 到 CDQ 的全解析

?引入

在匯編語言的世界里,數據寬度的轉換是一項基礎卻至關重要的操作。尤其是在處理有符號數時,符號擴展(Sign Extension)作為保持數值符號一致性的核心技術,直接影響著運算結果的正確性。本文將聚焦 x86 架構中最常用的四條符號擴展指令 ——CBW、CWD、CWDE、CDQ,深入解析它們的功能、操作機制及適用場景,幫助讀者徹底掌握這類指令的用法邏輯。

一、寄存器綁定限制引發的困惑

  • Q1:為什么只能擴展 AL/AX/EAX,其他寄存器(如 BL、CX)能否直接擴展?
    這是 x86 指令集的設計限制。例如CBW指令硬編碼為擴展AL→AX,若需擴展其他 8 位寄存器(如BL),需先將其值存入AL(也就是說這些擴展都是特定的寄存器):

    mov al, bl   ; 先將BL的值傳給AL
    cbw          ; 再擴展AL→AX
    
  • 這種 “中轉” 操作常被初學者遺漏,直接導致錯誤。

  • Q2:CDQ 指令能否擴展 ECX 寄存器?
    不能。CDQ僅作用于EAX,若要擴展ECX,需手動通過算術右移(sar ecx, 31)或條件賦值實現,這要求對補碼原理有深刻理解。


二,CBW(Convert Byte to Word):數據寬度的 “拉伸器”

1.?功能:將字節(8 位)擴展為字(16 位)
  • 核心操作:將?AL?中的 8 位有符號數,通過符號擴展轉換為 16 位,存入?AX(高 8 位填充符號位,低 8 位保持不變)。
    • 正數擴展:若?AL ≥ 0(符號位為 0),則?AH = 0x00
    • 負數擴展:若?AL < 0(符號位為 1),則?AH = 0xFF
  • 示例
    MOV AL, 0x7F    ; AL = +127(0111 1111B)
    CBW             ; AX = 0x007F(AH=0x00,AL=0x7F)MOV AL, 0x80    ; AL = -128(1000 0000B)
    CBW             ; AX = 0xFF80(AH=0xFF,AL=0x80)
    
2.?執行流程
  1. 讀取 AL 的符號位(第 7 位)。
  2. 將符號位復制到 AH 的所有位(0 或 0xFF)。
  3. AX = AH:AL(高 8 位為符號擴展,低 8 位不變)。
3.?標志位影響

CBW?不影響任何標志位(CF、ZF、SF 等保持原值),僅修改寄存器內容。

4.?生活類比:溫度計刻度擴展
  • CBW 指令:相當于將溫度計的刻度范圍從?-128~127℃(8 位)擴展到?-32768~32767℃(16 位),但保持實際溫度值不變。
    MOV AL, 0x9B    ; AL = -101℃(1001 1011B)
    CBW             ; AX = 0xFF9B(高8位填充1,保持值為 -101℃)
    
5.?常見用途
  • 場景 1:有符號數運算前的寬度匹配

    MOV AL, -5     ; AL = 0xFB(-5的補碼)
    CBW            ; AX = 0xFFFB(-5的16位表示)
    ADD AX, 1000   ; 正確計算 -5 + 1000 = 995(0x03E3)
    
  • 場景 2:從內存讀取有符號字節并擴展

    MOV AL, [NUM]  ; 假設 [NUM] 存儲有符號字節 -10(0xF6)
    CBW            ; AX = 0xFFF6(-10的16位表示)
    
  • 場景 3:為多字節運算做準備

    ; 計算 16位數 = 8位數 × 16位數
    MOV AL, -3     ; AL = 0xFD(-3)
    CBW            ; AX = 0xFFFD(-3的16位表示)
    MOV BX, 100    ; BX = 100
    IMUL BX        ; AX = -3 × 100 = -300(0xFEEC)
    
6.?常見錯誤
  1. 誤用 CBW 處理無符號數

    MOV AL, 0xFF   ; AL = 255(無符號數)
    CBW            ; AX = 0xFFFF(-1的補碼,錯誤!)
    ; 正確:無符號數應使用 MOVZX 指令零擴展
    MOVZX AX, AL   ; AX = 0x00FF(正確)
    
  2. 混淆 CBW 和 CWD(Convert Word to Double Word)

    MOV AX, 0x8000 ; AX = -32768(有符號數)
    CBW            ; 錯誤!CBW 只處理 AL,此處 AX 不變
    CWD            ; 正確:將 AX 擴展為 DX:AX(DX=0xFFFF,AX=0x8000)
    
  3. 在不需要擴展時使用 CBW

    MOV AL, 5      ; AL = 5
    CBW            ; AX = 0x0005(多余操作,直接 MOV AX, 5 更高效)
    
7.?一句話總結

CBW 是有符號數的 “寬度安全擴展器”,通過復制符號位(0 或 1)填充高位,確保數值不變。使用時需注意:

  1. 僅處理 AL → AX,擴展為 16 位;
  2. 只適用于有符號數,無符號數需用 MOVZX;
  3. 不影響標志位,僅修改寄存器內容。

類比記憶:CBW 就像給有符號數穿 “放大衣”,保持數值的正負性不變,只是把 “小碼衣服”(8 位)換成 “大碼衣服”(16 位)!


三,CWD(Convert Word to Double Word):數據寬度的 “雙倍鏡”

1.?功能:將字(16 位)擴展為雙字(32 位)
  • 核心操作:將?AX?中的 16 位有符號數,通過符號擴展轉換為 32 位,存入?DX:AX(DX 存高 16 位,AX 存低 16 位)。
    • 正數擴展:若?AX ≥ 0(符號位為 0),則?DX = 0x0000
    • 負數擴展:若?AX < 0(符號位為 1),則?DX = 0xFFFF
  • 示例
    MOV AX, 0x7FFF    ; AX = +32,767(0111 1111 1111 1111B)
    CWD              ; DX:AX = 0x00007FFF(DX=0x0000,AX=0x7FFF)MOV AX, 0x8000    ; AX = -32,768(1000 0000 0000 0000B)
    CWD              ; DX:AX = 0xFFFF8000(DX=0xFFFF,AX=0x8000)
    
2.?執行流程
  1. 讀取 AX 的符號位(第 15 位)。
  2. 將符號位復制到 DX 的所有位(0 或 0xFFFF)。
  3. DX:AX?組成 32 位有符號數(高 16 位為符號擴展,低 16 位不變)。
3.?標志位影響

CWD?不影響任何標志位(CF、ZF、SF 等保持原值),僅修改寄存器內容。

4.?生活類比:財務數據精度升級
  • CWD 指令:相當于將財務系統的金額精度從 “萬元”(16 位)升級到 “元”(32 位),但保持數值的正負性不變。
    MOV AX, 0xFFF9    ; AX = -7萬元(補碼表示)
    CWD              ; DX:AX = 0xFFFFFFFFFFFFF9(-7萬元 → -70,000元)
    
5.?常見用途
  • 場景 1:有符號數除法前的擴展

    MOV AX, -1000    ; AX = 0xFC18(-1000的補碼)
    CWD              ; DX:AX = 0xFFFFFC18(32位-1000)
    MOV BX, 10      ; 除數 = 10
    IDIV BX         ; 商 = AX = -100,余數 = DX = 0
    
  • 場景 2:多精度數運算準備

    ; 計算 32位數 = 16位數 × 16位數
    MOV AX, -5000   ; AX = 0xEC78(-5000)
    CWD              ; DX:AX = 0xFFFFEC78
    MOV BX, 300     ; BX = 300
    IMUL BX         ; DX:AX = -5000 × 300 = -1,500,000(0xFFE85100)
    
  • 場景 3:符號擴展后存入內存

    MOV AX, 0x8001  ; AX = -32,767
    CWD              ; DX:AX = 0xFFFF8001
    MOV [RESULT], DX ; 存儲高16位
    MOV [RESULT+2], AX ; 存儲低16位(共32位)
    
6.?常見錯誤
  1. 誤用 CWD 處理無符號數

    MOV AX, 0xFFFF  ; AX = 65,535(無符號數)
    CWD              ; DX:AX = 0xFFFFFFFF(-1的補碼,錯誤!)
    ; 正確:無符號數應使用 MOVZX 指令零擴展
    MOVZX EAX, AX   ; EAX = 0x0000FFFF(正確)
    
  2. 混淆 CWD 和 CBW/CWQ

    MOV AL, 0x80    ; AL = -128
    CWD              ; 錯誤!CWD 只處理 AX,此處 AL 不變,DX:AX 被錯誤擴展
    CBW            ; 正確:將 AL 擴展為 AX(AX = 0xFF80)
    
  3. 在不需要擴展時使用 CWD

    MOV AX, 100     ; AX = 100
    CWD              ; DX:AX = 0x00000064(多余操作,直接 MOV EAX, 100 更高效)
    
7.?一句話總結

CWD 是 16 位有符號數的 “32 位轉換器”,通過復制符號位填充高 16 位,確保數值不變。使用時需注意:

  1. 僅處理 AX → DX:AX,擴展為 32 位;
  2. 只適用于有符號數,無符號數需用 MOVZX;
  3. 不影響標志位,僅修改寄存器內容;
  4. 常與 IDIV 配合,用于有符號數除法。

類比記憶:CWD 就像給 16 位有符號數 “加杠桿”,數值大小不變,但精度從 “16 位精度” 提升到 “32 位精度”,就像把 “萬元” 單位換算成 “元” 單位!


四,CWDE(Convert Word to Double Word with Extension):16 位到 32 位的 “安全轉換器”

1.?功能:將字(16 位)擴展為雙字(32 位)并存入 EAX
  • 核心操作:將?AX?中的 16 位有符號數,通過符號擴展轉換為 32 位,存入?EAX(高 16 位填充符號位,低 16 位保持不變)。
    • 正數擴展:若?AX ≥ 0(符號位為 0),則?EAX?的高 16 位為?0x0000
    • 負數擴展:若?AX < 0(符號位為 1),則?EAX?的高 16 位為?0xFFFF
  • 示例
    MOV AX, 0x7FFF    ; AX = +32,767(0111 1111 1111 1111B)
    CWDE             ; EAX = 0x00007FFF(高16位補0)MOV AX, 0x8000    ; AX = -32,768(1000 0000 0000 0000B)
    CWDE             ; EAX = 0xFFFF8000(高16位補1)
    
2.?執行流程
  1. 讀取 AX 的符號位(第 15 位)。
  2. 將符號位復制到 EAX 的高 16 位(0 或 0xFFFF)。
  3. EAX = 高 16 位符號擴展 + AX(低 16 位不變)。
3.?標志位影響

CWDE?不影響任何標志位(CF、ZF、SF 等保持原值),僅修改 EAX 寄存器。

4.?與 CWD 的對比
指令源操作數目標操作數擴展方式
CWDAXDX:AX(32 位)符號擴展到 DX 和 AX
CWDEAXEAX(32 位)符號擴展到 EAX 的高 16 位
  • 示例對比
    MOV AX, 0x8000    ; AX = -32,768
    CWD              ; DX = 0xFFFF, AX = 0x8000(DX:AX = 0xFFFF8000)
    CWDE             ; EAX = 0xFFFF8000(高16位補1,低16位不變)
    
5.?生活類比:視頻分辨率升級
  • CWDE 指令:相當于將 16 位分辨率的圖像(如游戲中的角色 ID)擴展為 32 位,保持數值不變但增加了精度。
    MOV AX, 0xFF00    ; AX = -256(角色ID的負數表示)
    CWDE             ; EAX = 0xFFFFFF00(32位擴展,仍表示-256)
    
6.?常見用途
  • 場景 1:有符號數運算前的寬度匹配

    MOV AX, -1000    ; AX = 0xFC18(-1000)
    CWDE             ; EAX = 0xFFFFFFC18(32位-1000)
    ADD EAX, 5000    ; 正確計算 -1000 + 5000 = 4000(0x00000FA0)
    
  • 場景 2:為 32 位除法做準備

    MOV AX, 0x8001   ; AX = -32,767
    CWDE             ; EAX = 0xFFFF8001(32位-32,767)
    CDQ              ; EDX:EAX = 0xFFFFFFFFFFFF8001(擴展為64位)
    IDIV ECX         ; 除以ECX中的除數
    
  • 場景 3:函數參數傳遞

    MOV AX, -50     ; AX = 0xFFCE(-50)
    CWDE             ; EAX = 0xFFFFFFCE(32位-50)
    PUSH EAX        ; 將32位參數壓棧
    CALL FUNC       ; 調用函數
    
7.?常見錯誤
  1. 誤用 CWDE 處理無符號數

    MOV AX, 0xFFFF  ; AX = 65,535(無符號數)
    CWDE             ; EAX = 0xFFFFFFFF(-1的補碼,錯誤!)
    ; 正確:無符號數應使用 MOVZX 指令零擴展
    MOVZX EAX, AX   ; EAX = 0x0000FFFF(正確)
    
  2. 混淆 CWDE 和 CWD

    MOV AX, 0x8000  ; AX = -32,768
    CWDE             ; EAX = 0xFFFF8000(正確擴展到EAX)
    CWD              ; DX = 0xFFFF, AX = 0x8000(錯誤!覆蓋AX內容)
    
  3. 在 64 位模式下使用 CWDE 擴展到 RAX

    MOV AX, 0x7FFF  ; AX = +32,767
    CWDE             ; EAX = 0x00007FFF(高32位被清0!)
    ; 正確:在64位模式下應使用 MOVSX 指令
    MOVSX RAX, AX   ; RAX = 0x0000000000007FFF(完整64位擴展)
    
8.?一句話總結

CWDE 是 16 位有符號數向 32 位擴展的 “專用工具”,通過符號擴展保持數值不變,存入 EAX 寄存器。使用時需注意:

  1. 僅處理 AX → EAX,擴展為 32 位;
  2. 只適用于有符號數,無符號數需用 MOVZX;
  3. 不影響標志位,僅修改 EAX;
  4. 與 CWD 的區別:CWD 擴展到 DX:AX,而 CWDE 直接擴展到 EAX。

類比記憶:CWDE 就像給 16 位有符號數 “穿上 32 位外套”,保持數值的正負性不變,只是把 “小衣服” 換成 “大衣服”,并且直接塞進 EAX 這個 “大口袋” 里!


五,CDQ(Convert Double Word to Quad Word):32 位到 64 位的 “符號擴展器”

1.?功能:將雙字(32 位)擴展為四字(64 位)
  • 核心操作:將?EAX?中的 32 位有符號數,通過符號擴展轉換為 64 位,存入?EDX:EAX(EDX 存高 32 位,EAX 存低 32 位)。
    • 正數擴展:若?EAX ≥ 0(符號位為 0),則?EDX = 0x00000000
    • 負數擴展:若?EAX < 0(符號位為 1),則?EDX = 0xFFFFFFFF
  • 示例
    MOV EAX, 0x7FFFFFFF  ; EAX = +2,147,483,647(最大32位正數)
    CDQ                 ; EDX:EAX = 0x000000007FFFFFFF(64位表示)MOV EAX, 0x80000000  ; EAX = -2,147,483,648(最小32位負數)
    CDQ                 ; EDX:EAX = 0xFFFFFFFF80000000(64位表示)
    
2.?執行流程
  1. 讀取 EAX 的符號位(第 31 位)。
  2. 將符號位復制到 EDX 的所有位(0 或 0xFFFFFFFF)。
  3. EDX:EAX?組成 64 位有符號數(高 32 位為符號擴展,低 32 位不變)。
3.?標志位影響

CDQ?不影響任何標志位(CF、ZF、SF 等保持原值),僅修改 EDX 和 EAX 寄存器。

4.?生活類比:銀行賬戶余額擴展
  • CDQ 指令:相當于將 32 位精度的銀行余額(最大約 21 億)擴展為 64 位(最大約 92 億億),保持數值的正負性不變。
    MOV EAX, 0xFFFFFFFF  ; EAX = -1(欠款1元)
    CDQ                 ; EDX:EAX = 0xFFFFFFFFFFFFFFFF(64位表示欠款1元)
    
5.?常見用途
  • 場景 1:32 位有符號數除法前的擴展

    MOV EAX, -1000     ; EAX = 0xFFFFFFC18(-1000)
    CDQ                ; EDX:EAX = 0xFFFFFFFFFFFFFFC18(64位-1000)
    MOV ECX, 5        ; 除數 = 5
    IDIV ECX          ; 商 = EAX = -200,余數 = EDX = 0
    
  • 場景 2:多精度數運算準備

    ; 計算 64位數 = 32位數 × 32位數
    MOV EAX, 0x80000000  ; EAX = -2,147,483,648
    CDQ                 ; EDX:EAX = 0xFFFFFFFF80000000
    MOV ECX, 2        ; ECX = 2
    IMUL ECX          ; EDX:EAX = -4,294,967,296(0xFFFFFFFF80000000 × 2)
    
  • 場景 3:函數參數傳遞(64 位參數)

    MOV EAX, 0x80000000  ; EAX = -2,147,483,648
    CDQ                 ; EDX:EAX = 0xFFFFFFFF80000000(64位參數)
    PUSH EDX            ; 壓入高32位
    PUSH EAX            ; 壓入低32位
    CALL FUNC_64        ; 調用處理64位參數的函數
    
6.?常見錯誤
  • 誤用 CDQ 處理無符號數

    MOV EAX, 0xFFFFFFFF  ; EAX = 4,294,967,295(無符號數)
    CDQ                 ; EDX:EAX = 0xFFFFFFFFFFFFFFFF(-1的補碼,錯誤!)
    ; 正確:無符號數應使用 MOVZX 指令零擴展
    MOV EDX, 0          ; 手動零擴展高32位
    
  • 混淆 CDQ 和 CWDE/CWD

    MOV AX, 0x8000      ; AX = -32,768
    CDQ                ; 錯誤!CDQ 只處理 EAX,此處 EDX 被錯誤設置為 0xFFFF
    CWDE               ; 正確:先將 AX 擴展為 EAX(EAX = 0xFFFF8000)
    CDQ                ; 再將 EAX 擴展為 EDX:EAX(EDX:EAX = 0xFFFFFFFFFFFF8000)
    
  • 在不需要擴展時使用 CDQ

    MOV EAX, 100        ; EAX = 100
    CDQ                ; EDX:EAX = 0x0000000000000064(多余操作)
    ; 若不需要64位,直接使用 EAX 即可
    
7.?64 位模式下的替代方案

在 64 位模式下,若需將?EAX?擴展為?RAX(64 位),可使用?MOVSX?指令:

MOV EAX, 0x80000000  ; EAX = -2,147,483,648
MOVSX RAX, EAX       ; RAX = 0xFFFFFFFF80000000(符號擴展到64位)
; 等效于 CDQ 在32位模式下的功能,但直接擴展到 RAX
8.?一句話總結

CDQ 是 32 位有符號數向 64 位擴展的 “標準工具”,通過符號擴展保持數值不變,存入 EDX:EAX。使用時需注意:

  1. 僅處理 EAX → EDX:EAX,擴展為 64 位;
  2. 只適用于有符號數,無符號數需手動零擴展(MOV EDX, 0);
  3. 不影響標志位,僅修改 EDX 和 EAX;
  4. 常與 IDIV 配合,用于 32 位有符號數除法。

類比記憶:CDQ 就像給 32 位有符號數 “添加一個 32 位的符號影子”,正數的影子是全 0,負數的影子是全 1,兩者組合形成 64 位的完整表示!


六,握符號擴展,解鎖匯編數據轉換的底層邏輯

CBW的字節到字擴展,到CDQ的雙字到四字擴展,x86 架構的符號擴展指令構成了一套精密的數據類型轉換體系。它們的設計遵循 “固定寄存器綁定” 原則 ——AL/AX/EAX作為源操作數,目標寄存器或組合(AX/DX:AX/EAX/EDX:EAX)則由指令后綴(B/W/D/Q)明確界定,這種 “硬編碼” 式的規則雖限制了靈活性,卻保證了底層操作的高效性與確定性。

對于開發者而言,理解這些指令的核心價值在于:

  1. 精準控制符號位:在有符號數運算(如除法前的被除數擴展、函數參數跨位數傳遞)中,避免因符號位丟失導致的數值錯誤;
  2. 適配架構特性:在 16 位實模式、32 位保護模式、64 位長模式下,根據目標寄存器寬度(AX/EAX/RAX)選擇正確指令(如 32 位用CWDE,64 位用CDQ);
  3. 區分符號與零擴展:永遠牢記 ——有符號數用符號擴展(保留符號位),無符號數用零擴展(MOVZX等),二者不可混淆。

當你能熟練運用CBW將鍵盤輸入的 8 位字符擴展為 16 位整數,用CDQ為 64 位除法準備EDX:EAX操作數,甚至能手動為CX寄存器編寫符號擴展算法時,便真正觸摸到了匯編語言 “貼近硬件” 的設計哲學。這些看似簡單的指令,實則是連接高級語言類型系統與底層二進制運算的橋梁 —— 畢竟,無論 C 語言中的charint,還是 Java 的 “自動類型提升”,其底層實現的本質,正是這里剖析的符號擴展邏輯。

匯編的魅力,在于用最少的指令完成最精準的控制。掌握CBW/CWD/CWDE/CDQ,便是掌握了數據寬度轉換的 “匯編密碼”。下次調試程序時,若遇到因符號位錯誤導致的詭異結果,不妨回到這些基礎指令,讓底層的光芒照亮代碼的每一個字節。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82961.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82961.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機基礎知識(第五篇)

計算機基礎知識&#xff08;第五篇&#xff09; 架構演化與維護 軟件架構的演化和定義 軟件架構的演化和維護就是對架構進行修改和完善的過程&#xff0c;目的就是為了使軟件能夠適應環境的變化而進行的糾錯性修改和完善性修改等&#xff0c;是一個不斷迭代的過程&#xff0…

前端開發三劍客:HTML5+CSS3+ES6

在前端開發領域&#xff0c;HTML、CSS和JavaScript構成了構建網頁與Web應用的核心基礎。隨著技術標準的不斷演進&#xff0c;HTML5、CSS3以及ES6&#xff08;ECMAScript 2015及后續版本&#xff09;帶來了諸多新特性與語法優化&#xff0c;極大地提升了開發效率和用戶體驗。本文…

c++ 頭文件

目錄 防止頭文件重復包含 頭文件的作用 如何讓程序的多個 .cpp 文件之間共享全局變量&#xff08;可能是 int、結構體、數組、指針、類對象&#xff09;? 防止頭文件重復包含 為什么要防止頭問件重復包含&#xff1f; 當然一般也不會把變量定義放到頭問件&#xff0c;那為…

深入解析 JavaScript 中 var、let、const 的核心區別與實踐應用

一、歷史背景與語法基礎 JavaScript 作為動態弱類型語言&#xff0c;變量聲明機制經歷了從 ES5 到 ES6 的重大變革。在 ES5 及更早版本中&#xff0c;var 是唯一的變量聲明方式&#xff0c;而 ES6&#xff08;2015 年&#xff09;引入了 let 和 const&#xff0c;旨在解決 var…

【Linux庖丁解牛】—自定義shell的編寫!

1. 打印命令行提示符 在我們使用系統提供的shell時&#xff0c;每次都會打印出一行字符串&#xff0c;這其實就是命令行提示符&#xff0c;那我們自定義的shell當然也需要這一行字符串。 這一行字符串包含用戶名&#xff0c;主機名&#xff0c;當前工作路徑&#xff0c;所以&a…

應用案例 | 設備分布廣, 現場維護難? 宏集Cogent DataHub助力分布式鍋爐遠程運維, 讓現場變“透明”

在日本&#xff0c;能源利用與環保問題再次成為社會關注的焦點。越來越多的工業用戶開始尋求更高效、可持續的方式來運營設備、管理能源。而作為一家專注于節能與自動化系統集成的企業&#xff0c;日本大阪的TESS工程公司給出了一個值得借鑒的答案。 01 鍋爐遠程監控難題如何破…

【OSG學習筆記】Day 16: 骨骼動畫與蒙皮(osgAnimation)

骨骼動畫基礎 骨骼動畫是 3D 計算機圖形中常用的技術&#xff0c;它通過以下兩個主要組件實現角色動畫。 骨骼系統 (Skeleton)&#xff1a;由層級結構的骨頭組成&#xff0c;類似于人體骨骼蒙皮 (Mesh Skinning)&#xff1a;將模型網格頂點綁定到骨骼上&#xff0c;使骨骼移動…

jdk同時安裝多個版本并自由切換

一、安裝不同版本的JDK 二、配置環境變量&#xff08;多版本JDK&#xff09; 1. 新建版本專用環境變量&#xff08;用于切換&#xff09; 操作位置&#xff1a;系統變量 > 新建 變量名&#xff1a;JAVA_HOME_1.8 變量值&#xff1a;JDK 8安裝路徑變量名&#xff1a;JAVA1…

java中裝飾模式

目錄 一 裝飾模式案例說明 1.1 說明 1.2 代碼 1.2.1 定義數據服務接口 1.2.2 定義基礎數據庫服務實現 1.2.3 日志裝飾器 1.2.4 緩存裝飾器 1.2.5 主程序調用 1.3 裝飾模式的特點 一 裝飾模式案例說明 1.1 說明 本案例是&#xff1a;數據查詢增加緩存&#xff0c;使用…

【論文閱讀】YOLOv8在單目下視多車目標檢測中的應用

Application of YOLOv8 in monocular downward multiple Car Target detection????? 原文真離譜&#xff0c;文章都不全還發上來 引言 自動駕駛技術是21世紀最重要的技術發展之一&#xff0c;有望徹底改變交通安全和效率。任何自動駕駛系統的核心都依賴于通過精確物體檢…

在uni-app中如何從Options API遷移到Composition API?

uni-app 從 Options API 遷移到 Composition API 的詳細指南 一、遷移前的準備 升級環境&#xff1a; 確保 HBuilderX 版本 ≥ 3.2.0項目 uni-app 版本 ≥ 3.0.0 了解 Composition API 基礎&#xff1a; 響應式系統&#xff1a;ref、reactive生命周期鉤子&#xff1a;onMount…

408第一季 - 數據結構 - 圖

圖的概念 完全圖 無向圖的完全圖可以這么想&#xff1a;如果有4個點&#xff0c;每個點都會連向3個點&#xff0c;每個點也都會有來回的邊&#xff0c;所以除以2 有向圖就不用除以2 連通分量 不多解釋 極大連通子圖的意思就是讓你把所有連起來的都圈出來 強連通圖和強連通…

31.2linux中Regmap的API驅動icm20608實驗(編程)_csdn

regmap 框架就講解就是上一個文章&#xff0c;接下來學習編寫的 icm20608 驅動改為 regmap 框架。 icm20608 驅動我們在之前的文章就已經編寫了&#xff01; 因為之前已經對icm20608的設備樹進行了修改&#xff0c;所以大家可以看到之前的文章&#xff01;當然這里我們還是帶領…

Vue速查手冊

Vue速查手冊 CSS deep用法 使用父class進行限定&#xff0c;控制影響范圍&#xff1a; <template><el-input class"my-input" /> </template><style scoped> /* Vue 3 推薦寫法 */ .my-input :deep(.el-input__inner) {background-color…

振動力學:無阻尼多自由度系統(受迫振動)

本文從頻域分析和時域分析揭示系統的運動特性&#xff0c;并給出系統在一般形式激勵下的響應。主要討論如下問題&#xff1a;頻域分析、頻響函數矩陣、反共振、振型疊加法等。 根據文章1中的式(1.7)&#xff0c;可知無阻尼受迫振動的初值問題為&#xff1a; M u ( t ) K u …

真實案例分享,Augment Code和Cursor那個比較好用?

你有沒有遇到過這種情況&#xff1f;明明知道自己想要什么&#xff0c;寫出來的提示詞卻讓AI完全理解錯了。 讓AI翻譯一篇文章&#xff0c;結果生成的中文不倫不類&#xff0c;機器僵硬&#xff0c;詞匯不同&#xff0c;雞同鴨講。中國人看不懂&#xff0c;美國人表示聳肩。就…

zotero及其插件安裝

zotero官網&#xff1a;Zotero | Your personal research assistant zotero中文社區&#xff1a;快速開始 | Zotero 中文社區 插件下載鏡像地址&#xff1a;Zotero 插件商店 | Zotero 中文社區 翻譯&#xff1a;Translate for Zotero 接入騰訊翻譯API&#xff1a;總覽 - 控制…

【SSM】SpringMVC學習筆記8:攔截器

這篇學習筆記是Spring系列筆記的第8篇&#xff0c;該筆記是筆者在學習黑馬程序員SSM框架教程課程期間的筆記&#xff0c;供自己和他人參考。 Spring學習筆記目錄 筆記1&#xff1a;【SSM】Spring基礎&#xff1a; IoC配置學習筆記-CSDN博客 對應黑馬課程P1~P20的內容。 筆記2…

從認識AI開始-----變分自編碼器:從AE到VAE

前言 之前的文章里&#xff0c;我已經介紹了傳統的AE能夠將高維輸入壓縮成低維表示&#xff0c;并重建出來&#xff0c;但是它的隱空間結構并沒有概率意義&#xff0c;這就導致了傳統的AE無法自行生成新的數據&#xff08;比如新圖像&#xff09;。因此&#xff0c;我們希望&a…

智慧賦能:移動充電樁的能源供給革命與便捷服務升級

在城市化進程加速與新能源汽車普及的雙重推動下&#xff0c;移動充電樁正成為能源供給領域的一場革命。傳統固定充電設施受限于布局與效率&#xff0c;難以滿足用戶即時、靈活的充電需求&#xff0c;而移動充電樁通過技術創新與服務升級&#xff0c;打破了時空壁壘&#xff0c;…