IEEE754浮点数的表示方法:N = (-1)^s x m x 2^e,其中s为符号位,m是尾数位,e是指数位。
| 种类 | 符号位 | 指数位 | 尾数位 |
|---|---|---|---|
| float | 第31位(占1bit) | 第30-23位(占8bit) | 第22-0位(占23bit) |
| double | 第63位(占1bit) | 第62-52位(占11bit) | 第51-0位(占52bit) |
对于单精度浮点数(float)来说,符号位一位,指数位8位,尾数23位。指数能够表示的指数范围为-128~127,尾数为23位。
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。(指数二进制转换为十进制)
具体计算公式N = (-1)^s x m x 2^e,以float为栗子,但s=0,m=23,e=8时:
+1.1111111111111111111111 x 2^127(小数点后面23个1,由于尾数的范围1~2,其最高位总为1,故只需存取小数部分,所以小数为是23位1),约等于2 x 2^127=3.4 x 10^38。负数亦然。
long表示的是一个整型的数据,在不同系统或语言定义可能不同,在内存32位或64位,即表示的是一个有32/64位二进制数表示的一个整数,最大为 2^63-1.
但double不一样,表示的是浮点数,以EEE754浮点数表示方法为:N = (-1)^s x m x 2^e,其范围和精度是由其指数和位数决定的。所说的32位或64位是指该浮点数的符号位+指数位+尾数位.
两者在表示形式就不一样,而不能简单地根据数据所占位数去比较它们的大小。
补充:理解32位系统和64位系统
32位系统CPU一次可处理32位数据,即一次处理4个字节;64位系统CPU一次可处理64位数据,即一次处理8个字节。
x86与x86-64有什么区别呢?x86指的是一般意义上的32位Intel处理器;而x86_64 则是一般意义上的64位Intel处理器。
原文:https://www.cnblogs.com/small-world/p/11622714.html