// 20test21long-intConA1001.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//UINT32_MAX 进制的 +-* 和 分余
#include <iostream>
#include <vector>
using namespace std;
typedef unsigned long long int ulli;
//
unsigned short shorA = 0xffff;
unsigned short MaxShor = 0xffff;
unsigned int ina = 0xffffffff;//8个f
unsigned int Maxint = 0xffffff;//8个f
unsigned int MaxInt = UINT32_MAX;
//unsigned int ina = 0xffffffffffffffff; //最多16个f
unsigned long long int llib = 0xffffffffffffffff; //16个f
unsigned long long int MaxULli = 0xffffffffffffffff;
std::vector<ulli> ulla1 = { 0 };//从右至左存储数位
int maxLen01(std::vector<ulli> a, std::vector<ulli> b)
{
int u = a.size();
int v = b.size();
if (u > v) return u;
else return v;
}//int maxLen01
void add(std::vector<ulli> a, std::vector<ulli> b, std::vector<ulli>& c)
{
int tmpMax = maxLen01(a, b);
unsigned int jinwei = 0;
unsigned long long tmp_sum = 0;
std::vector<unsigned int> jinWei;// = { 0 };
// jinWei[0] = 0;
jinWei.push_back(0);// 进位 的下标 比 结果 c的下标 多 +1 即 : c[i]= a[i]+b[i]+ jinwei[i+1];
// jinWei.push_back(0);//
// c.push_back(0);
for (int i = 0; i < tmpMax; ++i)
{
//下面开始 用 “竖式”加法:
tmp_sum = a[i] + b[i] + jinWei[i];// +c[i];// c[i]; // jinWei[i + 1]; //c0=a0+b0+ jinwei[1]
//当 前一位没有进位的时候:
//if (jinWei[i] <= 0) { c.push_back(0); } //有进位时候 就 不要 push了,因为 push过了! //本位 的 容器 要提前 生成;
//上次没有 进位, 所以 要单独 push一个
//jinWei.push_back(0);
if (tmp_sum > (ulli)MaxInt ) {//if220
jinWei.push_back((tmp_sum >> 32) ); //生成 更 高一位(下一进位、更高一位进位) 的 进位(容器)
//c[i] = (tmp_sum - MaxInt - 1);//本位的处理: 如(地位)上一次 有进位则:
if (jinWei[i] > 0) { c[i] = tmp_sum - MaxInt - 1; }
else if (jinWei[i] <= 0) { c.push_back( tmp_sum-MaxInt-1 ); } //推迟生成 本位(容器);有进位时候 就 不要 push了,因为 push过了! //本位 的 容器 要提前 生成
c.push_back(tmp_sum >> 32); //高位//生成 高 一位的容器 //注意此处 早 生成了 一次 (上位)下一次的 c容器
// tmp_sum = tmp_sum - MaxInt-1;//这句纯粹 防止 c的长度 大于 (Max(a,b)者);
}//if220
else if (tmp_sum <= MaxInt) { jinWei.push_back(0); //进位
if (jinWei[i] > 0) { c[i] = tmp_sum - MaxInt - 1; }
else if (jinWei[i] <= 0) { c.push_back(tmp_sum - MaxInt - 1); } //推迟生成本位(容器)//本位
jinWei.push_back(0 ) ;// 也要生成 更高 一位(下一位)进位 容器
}
//c[i] = tmp_sum;
}//for110i
}//void add
void printVhex(std::vector<ulli> c) //打印 16进制 十六进制格式
{
int tmpLen = c.size();
std::cout << hex;
for (int i = tmpLen; i > 0; --i) {
std::cout << hex;
unsigned long long tmp_ull = c[i - 1];
tmp_ull = tmp_ull << 32; //去掉 高位, 不管 高位 是 否 为0
tmp_ull = tmp_ull >> 32;
std::cout << tmp_ull;
}
std::cout << std::endl;
}//void printV
int main()
{
//
std::cout << hex;
std::cout << "UINT32_MAX:"<<UINT32_MAX << endl;
std::cout << "UINT64_MAX:"<<UINT64_MAX << endl;
std::cout << "UINTMAX_MAX:"<<UINTMAX_MAX << endl;
// std::cout << LLONG_MAX << endl;
std::vector<ulli> a1;
std::vector<ulli> b1;
std::vector<ulli> c1;
// ula1[0] = 0x11111111;
a1.push_back(0xffffffff);// 111111111);
a1.push_back(0x2);
printVhex(a1);
// ulb1[0] = 0x333333333;
b1.push_back(0xeeeeeeee);// 33333333);
b1.push_back(0x1);
printVhex(b1);
maxLen01( a1, b1);
add( a1, b1, c1);
printVhex(c1);
//
// LongLVecto aa12;
}//