区分负数和正数?

时间:2015-01-24 21:19:30

标签: binary

在二进制文件中,我们可以有一个有符号和无符号的数字,所以我们假设我们的值为0101我们怎么能判断它是等于5还是{{} 1}} -1

2 个答案:

答案 0 :(得分:1)

二进制没有区别。不同之处在于给定语言/编译器/环境/处理器如何处理给定的二进制数字序列。例如,在Intel x86 / x64世界中,您有MULIMUL乘法指令。 IMUL指令执行 signed 乘法(即将操作数位视为有符号值)。还有其他说明可区分有符号/无符号操作数(例如DIV / IDIVMOVSX等。)

这是一个简单的例子:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

int main(void)
{
    int16_t  c16;
    uint16_t u16;

    __asm {
      mov al, 0x01
      mov bl, 0x8F
      mul bl          // ax = 0x01 * 0x8F
      mov u16, ax

      mov al, 0x01
      mov bl, 0x8F
      imul bl         // ax = 0x01 * 0x8F
      mov c16, ax
    };

    char uBits[65];
    char cBits[65];

    printf("%u:\t%s\n", u16, _itoa(u16, uBits, 2));
    printf("%d:\t%s\n", c16, _itoa(c16, cBits, 2));

  return 0;
}

输出是:

143:    10001111
-113:   11111111111111111111111110001111

编辑时:
只是为了扩展示例 - 在C / C ++中(与区分有符号和无符号数量的其他语言一样),编译器知道它是在有符号值还是无符号值上运行并生成相应的指令。在上面的示例中,编译器还知道在调用c16时它必须正确地对变量_itoa()进行签名扩展,因为它将它提升为int(在C / C ++中,int默认情况下签名 - 它相当于说signed int)。变量u16unsigned int的调用中被提升为_itoa(),因此不会发生符号扩展(因为在无符号值中显然没有符号位)。

答案 1 :(得分:0)

在实际硬件上,负数的实现取决于设计者选择的内容。通常带符号的数字用Two's Complement

表示

但有Many More