Binary 区分负数和正数?

Binary 区分负数和正数?,binary,Binary,在二进制中,我们可以有一个有符号和无符号的数字,因此假设我们得到一个值0101,我们如何判断它是等于5还是等于-1,正如您可能注意到的,左边的第二位是开着的二进制中没有区别。区别在于给定的语言/编译器/环境/处理器如何处理给定的二进制数字序列。例如,在英特尔x86/x64世界中,您有用于乘法的MUL和IMUL指令。IMUL指令执行有符号乘法(即将操作数位视为有符号值)。还有其他指令可以区分有符号/无符号操作数(例如DIV/IDIV,MOVSX等) 下面是一个简单的例子: #include <

在二进制中,我们可以有一个有符号和无符号的数字,因此假设我们得到一个值
0101
,我们如何判断它是等于
5
还是等于
-1
,正如您可能注意到的,左边的第二位是开着的
二进制中没有区别。区别在于给定的语言/编译器/环境/处理器如何处理给定的二进制数字序列。例如,在英特尔x86/x64世界中,您有用于乘法的
MUL
IMUL
指令。
IMUL
指令执行有符号乘法(即将操作数位视为有符号值)。还有其他指令可以区分有符号/无符号操作数(例如
DIV
/
IDIV
MOVSX
等)

下面是一个简单的例子:

#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;
}
编辑时:

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

在实际硬件上,负数的实现取决于设计者的选择。通常有符号的数字表示为

但是有

143:    10001111
-113:   11111111111111111111111110001111