首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >区分负数和正数?

区分负数和正数?
EN

Stack Overflow用户
提问于 2015-01-24 21:19:29
回答 2查看 1.2K关注 0票数 1

在二进制中,我们可以有一个有符号和无符号的数字,所以假设我们得到了一个0101的值,那么我们如何判断它是等于5还是-1 as you may notice the second bit from the left is on

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-24 21:25:45

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

下面是一个简单的例子:

代码语言:javascript
复制
#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;
}

产出如下:

代码语言:javascript
复制
143:    10001111
-113:   11111111111111111111111110001111

编辑:

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

票数 1
EN

Stack Overflow用户

发布于 2015-01-24 21:26:19

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

但是有更多

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28130362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档