c_cpp C中32位有符号整数机器的原型,它只使用int来对堆栈和求和进行加载

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp C中32位有符号整数机器的原型,它只使用int来对堆栈和求和进行加载相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

/*
 * Prototype for cell based vm
 * uses only arrays and blocks of 32-bit signed integer.
*/

// macro to get length of cells machine
#define CellMachine_LEN(cm) (cm->head - cm->cells)

// Used to read and categorize int cells
enum CellType {
	CellType_int,
	CellType_add
};

struct CellMachine {
	int size;
	int* head;
	const int* end;
	int* cells;
};

struct CellMachine* CellMachine_new(int size)
{
	struct CellMachine* mach = malloc(sizeof(struct CellMachine));
	mach->size = size;
	mach->cells = malloc(sizeof(int) * size);
	mach->head = mach->cells;
	mach->end = mach->head + size;
	memset(mach->cells, 0, size * sizeof(int));
	return mach;
}

//writes an int to the cells
void CellMachine_put_int(struct CellMachine* mach, int i)
{
	*(mach->head++) = CellType_int;
	*(mach->head++) = i;
	assert(mach->head < mach->end);
}

// sums the numbers loaded into the cells
int CellMachine_sum(struct CellMachine* mach)
{
	int sum = 0;
	int* traverse = mach->cells;
	while(traverse != mach->head)
	{
		switch(*traverse++)
		{
			case CellType_int:
			     sum += (*traverse++);
			     break;
			default:
			     fprintf(stderr, "%s\n", "Error unknown type in cell.");
			     return -1;
		}
	}
	return sum;
}

void CellMachine_rdx_sum(struct CellMachine* mach)
{
	int* start = mach->cells + 1;
	int* traverse = start + 1;
	while(traverse != mach->head)
	{
		switch(*traverse++)
		{
			case CellType_int:
			     *start += (*traverse++);
			     break;
			default:
			     fprintf(stderr, "%s\n", "Error unknown type in cell.");
			     return;			
		}
	}
	mach->head = start + 1;
}



int main(int argc, char const *argv[])
{
	struct CellMachine* machine = CellMachine_new(10);
	CellMachine_put_int(machine, 5);
	CellMachine_put_int(machine, 5);
	CellMachine_put_int(machine, 5);
	CellMachine_put_int(machine, 5);
	CellMachine_rdx_sum(machine);
	printf("sum is %d \n", machine->cells[1]);
	// sum is 20
	// load more value
	CellMachine_put_int(machine, 5);
	CellMachine_rdx_sum(machine);
	printf("sum is %d \n", machine->cells[1]);
	// sum is 25
	return 0;
}

以上是关于c_cpp C中32位有符号整数机器的原型,它只使用int来对堆栈和求和进行加载的主要内容,如果未能解决你的问题,请参考以下文章

将 32 位有符号整数转换为 24 位有符号音频数据

Python:如何将 32 位有符号长整数转换为 7 位整数

如何在 IA32 上将带符号的整数相加成更大的和。 32位有符号整数的64位总和?

2021-09-12:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string(

关于 64 位有符号整数的最大可计算值的困惑 [重复]

Scala学习