深入理解 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;…