1.关于溢出的问题
运算一定要注意溢出问题,溢出是一个很重要的问题;
在一种整数类型中,它的最小取值的负数等于它本身;
如short(-32768~32767), -(-32768) = -32768
如int(-2147483648~2147483647), -(-2147483648) = -2147483648
如long long(-9223372036854775808~9223372036854775807), -(-9223372036854775808) = 9223372036854775808
当然这种等于需要保持取负时,类型保持不变。
2.关于大小端的问题
大部分系统采用小端(Little Endian),少数系统采用大端(Big Endian)
小端即低地址放低位,高地址放高位。
3.关于浮点数的表示问题
我们存储浮点数分为三个区域:
这里以float为例
(1)符号区(Sign)(1bit), (2)指数区(Exponent)(8bit), (3)分数区(Fraction)(23bit)
我们需要注意到:分数区仅表示了小数部分,因为整数部分必定为1,这里省略掉一个bit用来存值。
但是当我们直接进行比较两个float大小时,可能会得到错误的结果
这里把二进制表示看作一个整体比较,会得到1/2 > 2的结果,这显然是不正确的。
于是IEEE采用了另一种偏移比较法,我们看下面的一组数:
这组数忽略了符号位,将全部的位都看作一个整体比较,它们实际上实现了一种偏移,0000本来是0, 0-7 = -7, 1111本来是15, 15-7=8
我们可以看到,整体的大小就代表了实际的大小,那么我们就可以使用这种性质。
我们只看Exponent区的8bit,-1=126-127,所以在Exponent区我们用126来代表-1,同理1=128-127我们用128来代表1
这样我们再直接比较就能够得到1/2 < 2的结果
因为float的Exponent区为8bit,故偏移量为127(2^7-1); double的Exponent区为11bit,故偏移量为127(2^10-1);
Exponent区的值 = 真实幂次 + 偏移量
3.关于浮点数的范围问题
(1)float
Exponent区我们保留了0000 0000和1111 1111另作他用
最小值:
Exponent最小值为0000 0001,即1,真实值 = Exponent区的值 - Exponent区的值 = 1 - 127 = -126
Fraction最小值为0000 0000即为1 + 0.0 = 1.0,
故小表示范围为±1.02^-126 ≈ ±1.210^-12
最大值:
Exponent最大值为1111 1110,即254,真实值 = Exponent区的值 - Exponent区的值 = 254 - 127 = +127
Fraction最小值为1111 1111 ≈ 1 + 1 = 2,
故小表示范围为±2.02^127 ≈ ±3.410^38
(2)double同理