实验程序是用vc6编译,一定注意文件扩展名为c,不是cpp,源码可以下载前面几个测试程序(链表、表、原子中有下载链接)中直接将下面源程序覆盖1.c的内容即可!
再次强烈建议在这些函数上设上断点,按F11跟进去把源码走一遍,才有真正的学习效果!
源程序如下:
#include <stdio.h>
#include <stdlib.h> //rand函数使用
#include <string.h>
#include "include/Xp.h"
#pragma comment(lib, "libcii.lib")
//定义15个无符号字节,理论上,使用XP_T可以表达1.3292279957849158729038070602803e+36(注意36位),足够做实验了!
// 定义N=1的话,是255;
// 定义N=2的话,是256*256-1 = 65535
// ....................
//
#define N (15)
void main()
{
//注意:C语言一定要将这些变量声明放在函数的头部
int i = 0;
XP_T x1, x2, x3;
XP_T q, r, tmp;
unsigned long k = 0;
char *str1, *stopstring;
char str2[100] = {0};
//
// 因为作者不建议使用XP_T接口(P232:建议使用AP接口或MP接口)。
// 如果一定要使用,那么首先要初始化
// XP_T变量,该接口没有初始化XP_T的接口
// XP_T 定义是 unsigned char *类型,很简单
//
x1 = (XP_T)malloc(N);
x2 = (XP_T)malloc(N);
x3 = (XP_T)malloc(2*N);
q = (XP_T)malloc(N);
r = (XP_T)malloc(N);
tmp = (XP_T)malloc(N);
//将一个数值来初始化x1,实际上是把整个数放到x1里
// 后面再把它取出来,检验是否正确?
XP_fromint(N, x1, 1000000000);
k = XP_toint(N, x1);
printf("k = %ld\n", k);
//用数值0来初始化x2,x3
// 就是初始化成{0x00, 0x00, 0x00, ......}
//
XP_fromint(N, x2, 0);
XP_fromint(2*N, x3, 0);
//用字符串来设置x2
//str1 = "1199000999933388833922999888444441234";
str1 = "22333334444433333333331234";
XP_fromstr(N, x2, str1, 10, &stopstring);
//转换到串并打印出来检查是否正确
// 注意:下面XP_tostr修改 x2的内容
// 所以,如果后面还要用到x2,就要把下面这一句注释掉
//
// XP_tostr(str2, 100, 10, N, x2);
// printf("x2 = %s\n", str2);
//加法: x3 = x2 + x1,并打出来检验
// 最后一位是进位(carry),用于高级接口使用的,这里单独测试,赋值0即可
//
XP_add(N, x3, x2, x1, 0);
memset(str2, 0x00, sizeof(str2));
XP_tostr(str2, 100, 10, N, x3); //注意,此句会修改x3
printf("(x3 = x2 + x1) = %s\n", str2);
//减法:x3 = x2 - x1,并打出来检验
//
XP_sub(N, x3, x2, x1, 0);
memset(str2, 0x00, sizeof(str2));
XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
printf("(x3 = x2 - x1) = %s\n", str2);
//乘法:x3 = x2 * x1,并打出来检验
// 做此操作时,将上面的加减法先注释掉;
// 另外,注意上面解释过的,不要超过36位,否则越位溢出
XP_mul(x3, 2*N, x2, N, x1);
memset(str2, 0x00, sizeof(str2));
XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
printf("(x3 = x2 * x1) = %s\n", str2);
//除法:q = x2/x1 (取整),r = x2%x1(取余)并打出来检验
// 做此操作时,将上面的加减法先注释掉;
// 先打印取整,再打印取余的值
//
XP_div(N, q, x2, N, x1, r, tmp);
memset(str2, 0x00, sizeof(str2));
XP_tostr(str2, 100, 10, N, q);//注意,此句会修改q
printf("q = x2/x1 = %s\n", str2);
memset(str2, 0x00, sizeof(str2));
XP_tostr(str2, 100, 10, N, r);//注意,此句会修改q
printf("r = x2%%x1 = %s\n", str2);
//XP_sum:
//
XP_sum(N, x3, x1, 100);
XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
printf("(x3 = x1 + 100) = %s\n", str2);
//XP_diff
//
XP_diff(N, x3, x1, 100);
XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
printf("(x3 = x1 - 100) = %s\n", str2);
//XP_product
//
XP_product(N, x3, x1, 255);
XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
printf("(x3 = x1 * 255) = %s\n", str2);
//XP_quotient:
//
XP_quotient(N, x3, x1, 50);
XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
printf("(x3 = x1 / 50) = %s\n", str2);
//XP_neg
//
XP_neg(N, x3, x1, 1);
XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
printf("(x3 = ~x1) = %s\n", str2);
//XP_cmp
// 需将前面转换打印(XP_tostr)用到x1, x2的地方注释掉
//
printf("XP_cmp = %d\n", XP_cmp(N, x2, x1));
//XP_lshift
//
XP_lshift(N, x3, N, x1, 2/*移动的比特位*/, 0/*填充位*/);
XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
printf("XP_lshift = %s\n", str2);
//XP_rshift
//
XP_rshift(N, x3, N, x1, 2/*移动的比特位*/, 0/*填充位*/);
XP_tostr(str2, 100, 10, N, x3);//注意,此句会修改x3
printf("XP_lshift = %s\n", str2);
//XP_length
//
printf("XP_length(x1) = %d\n", XP_length(N, x1));
//下面打印出x1里的内容验证
for(i=0; i<N; i++)
printf("%02x, ", x1[i]);
printf("\n检验是否一致:%ld\n",
0 + 0xca*256 + 0x9a*256*256 + 0x3b*256*256*256);
}