c - ARM 处理器如何区分负数和正数?

标签 c arm embedded processor firmware

让我们考虑使用 8 位处理器来简化我的问题。我知道 -2 被存储为其 2 的补码,即 0b1111_1110,该数据 block 的十进制表示形式是 254,对吗?现在,我的问题是 ARM 处理器如何区分“-2”和“254”,因为它们的二进制表示相同?

我尝试查找整个互联网,每个人都在解释处理器如何存储负数的方式。我只需要知道它们是如何区分的。

最佳答案

-2 is stored as its 2's complement which is 0b1111_1110 the decimal representation of this chunk of data is 254, right-?

是的,对于典型的现代系统来说确实如此。

Now, my question is how will ARM processors differentiate between a "-2" and a "254" since both their binary representation is same ?

处理器没有;编译器会这样做。

假设您有表达式value > 0。变量value和常量0都有类型。根据这些类型,编译器选择要使用的 CPU 指令。因此有符号和无符号比较可能会导致不同的编译器输出。

处理器不知道代码中的类型。它只是执行这些选定的指令。

Example with ARM64 gcc :

int icmp(int num) {
    return num > 0;
}

int ucmp(unsigned int num) {
    return num > 0;
}
icmp:
        sub     sp, sp, #16
        str     w0, [sp, 12]
        ldr     w0, [sp, 12]
        cmp     w0, 0
        cset    w0, gt
        and     w0, w0, 255
        add     sp, sp, 16
        ret
ucmp:
        sub     sp, sp, #16
        str     w0, [sp, 12]
        ldr     w0, [sp, 12]
        cmp     w0, 0
        cset    w0, ne
        and     w0, w0, 255
        add     sp, sp, 16
        ret

了解编译器如何生成略有不同的 cset 指令。

关于c - ARM 处理器如何区分负数和正数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57918753/

相关文章:

c - 使用 BSD 套接字模拟事件的 FTP 连接

architecture - 在 ARM 中区分数据和指令

在 C 中使用远指针时更改代码大小

android-ndk - ARM clang : couldn't allocate output register for constraint 'w'

c++ - "POR"在嵌入式开发中是什么意思?

c - 将地址存储为值并稍后在指针上使用它

c - 如何设置 dr7 寄存器的值以便在 x86-64 上创建硬件断点?

c - 字符串和链表 - C 编程

c - linux 中的内存管理 : implementing first fit

gcc - 使用链接描述文件显式设置起始堆栈指针