个人博客app,seo 适合哪些行业,wordpress打包小程序,深圳优化网站方法整数在内存中的存储#xff1a; 在计算机内存中#xff0c;整数通常以二进制形式存储。计算机使用一定数量的比特#xff08;bit#xff09;来表示整数#xff0c;比如32位或64位。在存储整数时#xff0c;计算机使用补码形式来表示负数#xff0c;而使用原码形式来表示…整数在内存中的存储 在计算机内存中整数通常以二进制形式存储。计算机使用一定数量的比特bit来表示整数比如32位或64位。在存储整数时计算机使用补码形式来表示负数而使用原码形式来表示正数。整数的存储方式使得计算机能够进行加减乘除等运算。 浮点数在内存中的存储: 与整数不同浮点数采用IEEE 754标准来存储。在内存中浮点数由三个部分组成符号位、指数位和尾数位。这种存储方式使得计算机能够表示小数和非常大或非常小的数字但也带来了精度丢失的问题。 IEEE 754标准
IEEE 754标准定义了浮点数的存储格式包括单精度浮点数32位和双精度浮点数64位。在这两种格式中浮点数的存储结构都由三个部分组成符号位、指数位和尾数位。 符号位用于表示浮点数的正负0表示正数1表示负数。 指数位用于表示浮点数的阶码指数部分指数位的长度决定了浮点数的表示范围。 尾数位用于表示浮点数的尾数尾数位的长度决定了浮点数的精度。
单精度浮点数32位
单精度浮点数采用32位来存储其中1位用于符号位8位用于指数位23位用于尾数位。
符号位1位 指数位8位 尾数位23位
双精度浮点数64位
双精度浮点数采用64位来存储其中1位用于符号位11位用于指数位52位用于尾数位。
符号位1位 指数位11位 尾数位52位 特别注意
当我们使用单精度浮点数32位来存储一个小数时可能会出现精度丢失的情况。例如让我们考虑存储十进制数 0.1 在单精度浮点数中的表示。
在十进制中0.1 可以用有限位数准确表示但在二进制中0.1 是一个无限循环小数。因此在单精度浮点数中0.1 的精确表示是不可能的。
让我们看看单精度浮点数中存储 0.1 的近似表示
首先将 0.1 转换为二进制。0.1 的二进制表示是 0.00011001100110011001100110...这是一个无限循环。
然后根据单精度浮点数的格式我们将其表示为科学计数法形式1.100110011001100110011002 x 2^-4。
在单精度浮点数中我们需要舍入到23位尾数。因此最终存储的近似值是
符号位0正数 指数位-4 127偏移值127是单精度浮点数的偏移量 尾数位10011001100110011001100
这个存储的近似值会导致精度丢失因为实际的0.1在单精度浮点数中无法被精确表示。在进行浮点数运算时这种精度丢失可能会积累导致不准确的结果。
举个例子
#include stdio.h
#include stdint.hint main()
{float num 0.1f; // 使用单精度浮点数表示0.1// 将浮点数的内存表示以十六进制打印出来uint32_t* ptr (uint32_t*)num;printf(0.1的内存表示为: 0x%08x\n, *ptr);return 0;
} #include stdio.h
#include stdint.hint main()
{float num -27.25f; // 使用单精度浮点数表示-27.25// 将浮点数的内存表示以十六进制打印出来uint32_t* ptr (uint32_t*)num;printf(内存中的表示为: 0x%08x\n, *ptr);// 分别提取符号位、指数位和尾数位uint32_t sign (*ptr 31) 0x1;uint32_t exponent (*ptr 23) 0xFF;uint32_t mantissa *ptr 0x7FFFFF;printf(符号位: %d\n, sign);printf(指数位: 0x%x\n, exponent);printf(尾数位: 0x%x\n, mantissa);return 0;
} 符号位1位
┌─────┬───────────────────────┬─────────────────────────────────────┐
| S | 指数位E | 尾数位M |
└─────┴───────────────────────┴─────────────────────────────────────┘31 23 0
例如 1.5
符号位1位
┌─────┬───────────────────────┬─────────────────────────────────────┐
| 0 | 01111111 | 10000000000000000000000 |
└─────┴───────────────────────┴─────────────────────────────────────┘31 23 0
符号位S用于表示浮点数的正负0表示正数1表示负数。指数位E用于表示浮点数的指数部分通过偏移bias来表示实际的指数值。尾数位M用于表示浮点数的尾数部分包括小数点后面的数字。