数的处理

对于数而言,分为两种,整数和浮点数

对于整数而言

你需要知道的是每个数的范围,才能够准确的使用他们,

  1. 8 位有符号整数能表示的范围是 −128 到 127,无符号时能表示的范围是 0 ~ 255。
  2. 16 位的有符号整数能表示的范围是 −32768 到 32767,无符号时能表示的范围是 0 ~ 65535。
  3. 32 位的有符号整数能表示的范围是 −2,147,483,648 到 2,147,483,647,无符号时能表示的范围是 0 ~ 4,294,967,295。
  4. 64 位的有符号整数能表示的范围是 −9,223,372,036,854,775,808 到 9,223,372,036,854,775,807,无符号时能表示的范围是 0 ~ 18,446,744,073,709,551,615。

而在有时,可以用第三方的库来处理大整数,也可以自己设计一个整数
采用数据结构来梳理

#define MAX_LEN
struct {
	unsigned int length; //代表了位数
	unsigned int value[MAX_LEN] ; //代表着每一位的值
}BigInt;

然后将两者相加,得到一个如果相加得到一个carry记录进位,存入到什么一个64位的数据中去,然后将
然后将低的32位放到放回结果中,将高的32位放到carry中,然后放入到下一个相加。

void BigIntAdd(const BigInt& value1, const BgiInt& value2, BigInt& result) {
BigInt result = value1;
unsigned int carry = 0;
if (value1.length < value2.length)
for(unsigned int i = 0; i < result.length; i++)
    {
        unsigned __int64 sum = value2.value[i];
        sum = sum + result.value[i] + carry;
        result.value[i] = (unsigned long)sum;
        carry = (unsigned)(sum >> 32);
    }
    //处理最高位,如果当前最高位进位 carry!=0,则需要增加大数的位数
    if(carry != 0)
    {
        result.value[result.length] = carry;
        result.length += 1;        
    }
}

浮点数

以 IEEE 754 标准为例,单精度浮点数(float)用 32 位二进制位表示,其中 31 位是符号位,23 ~ 30 共 8 个比特位表示指数,0 ~ 22 共 23 个比特位表示有效数字。双精度浮点数(double)用 64 位二进制表示,其中最高为 63 位是符号位,52 ~ 62 共 11 个比特位表示指数位,0~ 51 共 52 个比特位表示有效数字。
而对于精度而言,float 大概就只有23个比特,所以有效数字 7~8 个有效数位,双精度浮点数有 52 个比特位表示有效数字,换算成十进制的话也就是大约 16 个十进制位的有效数字。在10进制小数转化为二进制小数时,通过不断的*2,然后得到,对于没有完整得到的值而言,所以没有得到准确的值,所以,不能够通过等于符号来判断这个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值