You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在32位机器及x86架构中对双32位寄存器存储的64位数字取反

嘿,刚好对这类位操作问题熟得很,给你一步步拆解这两个问题:

问题1:32位机器中对64位数字执行取反操作

在32位机器上,硬件本身只能一次处理32位数据,所以64位数字必须拆分成高32位和低32位两个部分来处理。按位取反的逻辑很简单:每个二进制位0变1、1变0,对64位数字来说,等价于分别对高、低32位单独执行取反,再把结果组合回去。

举个实际的代码例子(用C语言,无符号类型避免符号扩展问题):

#include <stdint.h>

uint64_t negate_64bit_on_32bit(uint64_t num) {
    // 拆分高低32位
    uint32_t low = (uint32_t)num;
    uint32_t high = (uint32_t)(num >> 32);
    
    // 分别取反
    uint32_t neg_low = ~low;
    uint32_t neg_high = ~high;
    
    // 组合回64位数字
    return ((uint64_t)neg_high << 32) | neg_low;
}

其实更简洁的写法直接对64位变量取反就行——现代32位编译器会自动帮你拆分执行,比如return ~num;,但如果你想手动控制流程,上面的拆分方式就很清晰。

问题2:x86架构下对两个32位寄存器中的64位数字取反

x86架构中,64位数字通常会存在EDX:EAX寄存器对里(EDX存高32位,EAX存低32位),要完成取反操作,直接对两个寄存器分别执行NOT指令即可——NOT指令会翻转寄存器里的每一个二进制位,正好对应按位取反的需求。

汇编代码示例:

假设原64位数字存在EDX:EAX中,执行以下两条指令:

NOT EDX   ; 对高32位取反
NOT EAX   ; 对低32位取反

执行后,EDX:EAX就变成了原64位数字的按位取反结果。

C语言内嵌汇编示例(GCC风格):

如果是在C代码里操作变量对应的寄存器,可以这么写:

#include <stdint.h>

void negate_64bit_registers(uint32_t *high, uint32_t *low) {
    __asm__ volatile (
        "not %%edx\n\t"
        "not %%eax"
        : "+d"(*high), "+a"(*low)  ; 输入输出都用EDX和EAX
        :                           ; 无额外输入
        :                           ; 无破坏的寄存器说明
    );
}

这里"+d"表示EDX寄存器既是输入也是输出,"+a"对应EAX,执行后*high和*low就会被更新为取反后的结果。

内容的提问来源于stack exchange,提问作者lightboltandfire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:15:45