添加16位变量的函数

问题描述

我正在编写我的第一个仿真器(Intel 8086微处理器)。

我被困住了,因为我必须编写一个将16位变量加在一起的函数。这是我要编写的函数的原型:

uint16_t add(uint16_t reg,uint16_t operand);

例如,如果我们执行:

add(5,3)

函数应该像这样进行计算:

              111
  0000000000000101 (= 5)
+ 0000000000000011 (= 3)
  ----------------
              1000 (= 8)

并返回8。

要编写此函数,我需要找到一种方法来访问两个变量的每一位,然后将它们加在一起并将它们放置在第三个变量中。

这在C语言中是否可行?如果可以,那么有人可以启发我吗?

非常感谢您的回答。

解决方法

假设使用32位计算机,这非常简单:

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

_Bool carry;

uint16_t add (uint16_t reg,uint16_t operand)
{
  carry = (reg + operand) & 0xFFFF0000u;
  return reg + operand;
}

int main (void)
{
  int sum = add(65535,1);
  printf("%d,CF:%d\n",sum,(int)carry);
}

如果reg + operand将提升为32位int,并且如果加法超过16位,则布尔标志将设置为1。

,

您非常需要以下内容:

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

int carry = 0;

uint16_t add(uint16_t reg,uint16_t operand)
{
  uint32_t result = (unint32_t)reg + operand;

  carry = 0;
  if (result > 0xffff)
    carry = 1;

  return result &= 0xffff;
}


int main()
{
  uint16_t r1,r2,r3;

  r1 = 0x10;
  r2 = 0x1000;
  r3 = add(r1,r2);
  printf("r3 = %04x,carry = %d\n",r3,carry);

  r1 = 0x11;
  r2 = 0xffff;
  r3 = add(r1,carry);
}

使其适应您的需求。

,

如果要获取第n位(第0位是最低有效位,第16位是最高有效位),则可以

uint8_t bit = (num >> n) & 1;

这样做是对数字n进行右移,因此所需的位是最低有效位,然后对其进行位掩码以仅获取该位。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...