看到了float(IEEE75)与long(8421码)同样占4个字节,然而储存数值有差别,就想自己总结下,参考了网上的一些资源
1、变量类型不同
float属于单精度型浮点数据。
double属于双精度型浮点数据。(默认用double)
2、表达式指数位不同(IEEE75标准)
float的表达式为1bit(符号位)+8bits(指数位)+23bits(尾数位)
double的表达式为1bit(符号位)+ 11bits(指数位)+ 52bits(尾数位)
3、占用内存空间不同
float占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38(科学计数法)。
double占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308。
4、有效位数不同
float只能提供8位有效数字。
double可提供16位有效数字。
参考题目:
float型数据通常用IEEE754单精度浮点数格式表示。若编译器将float型变量x分配到一个32位浮点寄存器FR1中,且x=-8.25,则FR1的内容是()。
答案: C104 0000H (H16进制后缀,前缀0x)
float型数据通常用IEEE75单精度浮点数格式表示:
三部分组成:符号位、阶码、尾数;
1.符号位:
第31位(0-31) 正数--0 负数--1 (二进制中最右侧为第零位,首位为符号位)
2.阶码:
第30位----第23位(共8位)计算:将实数转化为二进制的指数表示形式,形如 a*2^n;a的取值范围应在在1~2之间,阶码 = n + 127,最后将其表示成二进制形式
3.尾数:
第22位----第0位(23bits)
-8.25:
1.符号位 = 1;
2. (8.25)10 = (1000.01)2 = 1.000 01 * 2^3; n = 3 阶码 = 3+127 = (130)10 = ( 100 0001 0)2
// 其中)10 )2分别代表10进制,2进制位于右下角标,编辑器显示不出来,这里直接将十进制整数和小数部分分别转换成二进制,再通过小数点位移数确定指数n为3,上述参数a的小数部分为尾数部分
3.尾数 : 000 0100 0000 0000 0000 0000
最终结果 : 1100 0001 0000 0100 0000 0000 0000 0000
1 100 0001 0 000 0100 0000 0000 0000 0000
符号位 阶码 尾数
十六进制: 1100 0001 0000 0100 0000 0000 0000 0000
c 1 0 4 0 0 0 0
附:在mysql中float(m,d)m表示的是最大长度,d表示的显示的小数位数。double是浮点计算(容易产生误差),decimal是定点计算(字符串储存)
参考: