ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

计算机内的数据存储方式

计算机内的数据存储方式 目录整数在内存中的存储源码、反码和补码关系源码反码和补码的用处大小端字节序和字节序判断为什么说在计算中会存在大小端的存储呢他们的好处是什么浮点数在内存中的存储浮点数的精确性浮点数的存储方式整数在内存中的存储我们会想我们要如何把文邹邹的内容改变成让计算机可以理解的内容那么就是通过二进制的数据来呈现出来让计算机可以理解的内容而在二进制的代码中又分为了源码、反码、补码的这三种当然不止有这三种但这三种也是最关键的三种代码。源码、反码和补码关系源码反码补码在正数的情况下三者的都是相同的而在负数的情况下源码-反码符号位不变其他位取反就变成反码反码-补码基于反码加1就是补码。例如源码10110110反码11001001补码11001010源码反码和补码的用处发明计算机的人为了进一步的节省计算机的空间只做了一个加法计算器那么我们要实现两数的相减的时候只需要取对应数字的相反数即可实现相减的操作1121-11-10但是如果直接在二进制的看情况下使用负数相加的话就会出现计算问题1,0100,1011,111(-2)5(-7) ?所以需要补码的使用来修改这样的错误1,0100,101源码1,010 0,101反码1,101 0,101补码1,110 0,1011,1100,1010,011源反补码0,011 3-253 √2-50,0101,1010,0101,0111,101补反源码1,101-1,010-1,011源码1,011 -32(-5) -3 √补充补码-反码-补码 和 补码-反码-源码 的操作是一致的。大小端字节序和字节序判断int main() { unsigned int a 0x11223344; char* p a; if (*p 0x44) { printf(小端); } else { printf(大端); } return 0; }如果是大端存储的话计算机就会把a 的数据按 11 22 33 44 的这四分按高位先存储低位后存储而小端存储就是反这过来的就会按44 33 22 11 的存储。就像在VS 2026 的编辑器里就是按小段存储来的。为什么说在计算中会存在大小端的存储呢他们的好处是什么这是因为在计算机系统中我们是以字节为单位的每个地址单元都对应着一个字节一个字节为8bit位但是在C语言中除了8 bit的char之外还有16 bit的short型32 bit的long型要看具体的编译器另外对于位数大于8位的处理器例如16位或者32位的处理器由于寄存器宽度大于一个字节那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x在内存中的地址为0x0010x的值为0x1122那么0x11为高字节0x22为低字节。对于大端模式就将0x11放在低地址中即0x0010中0x22放在高地址中即0x0011中。小端模式刚好相反。我们常用的X86结构是小端模式而KEIL C51则为大端模式。很多的ARMDSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。大端存储的优势人类可读性强数据的高位字节存储在低地址与人类书写习惯一致便于调试和内存查看。网络传输友好网络协议如TCP/IP默认采用大端序减少字节序转换的开销。大端存储的劣势硬件兼容性差现代主流处理器如x86、ARM多为小端架构需额外处理字节序转换。计算效率低多字节数值计算时可能需要调整字节顺序影响性能。小端存储的优势硬件效率高直接兼容x86等主流架构无需转换即可处理多字节数据。内存访问灵活低位字节在前可快速按需读取任意长度数据如仅读取int32的低16位。小端存储的劣势可读性差内存中数据排列与人类书写顺序相反调试时需额外转换。网络传输需转换与网络协议的大端序冲突需频繁进行字节序交换。应用场景对比大端存储网络协议、嵌入式系统如PowerPC、部分文件格式如BMP。小端存储x86/ARM处理器、本地数据存储、高性能计算场景。总结大端只是方便给人看计算机就头疼了小端是个计算机看到方便了计算机不利于人们看但是有谁天天盯着反汇编去看人还是直接看代码不可能总看着二级制代码所以大部分的编译器都是以小端存储来执行的只是大部分不一定全是。浮点数在内存中的存储浮点数的精确性我们在学习的C语言的时候总是听老师讲浮点数是无法精确的保存每一个数据的这是是为什么呢这是二进制代码的局限性也是本身数据的局限性在二进制要保存一个0.5是一个比较简单的0.5对应的二进制0.1而要保存一个0.4就没有办法准确存取存储了0.4对应的二进制代码0.011001100110011001100110……这是以为二进制只有0和1要保存浮点数只能对1进行掰开0.5来保存还不行就只能在掰成0.25来保存就这样无限的循环下去就是永远填不满所以只能无奈的情况下取最接近的数据来保存浮点数。浮点数的存储方式浮点数的存取其实就类似于科学技术法例如 125.5 - 1.255*10^2 所以数据就会分为个三部分第一就是符号位、第二就是存储1.255的数据存储第三部分就是存取次方2的当然计算机看的二进制的方式在变成科学计数法之前还得先变成二进制代码。以125.5为例先变成二进制0,1111101.1科学计数法二进制版0,1.1111011 * 2^(0,110)(次方也要以二进制来存取)已知4个字节占32个bit 位那么float 类型的三个区域的分布1个bit 位 符号位8个bit 位 次方位23个bit 位存储数值位已知8个字节占64个bit 位那么double 类型的三个区域的分布double 类型1个bit 位 符号位11个bit 位 次方位52个bit 位存储数值位还是以125.5为例0,1.1111011 * 2^(6)把这么一串数值存储进去在float 类型次方位还需要特殊处理6127133- 10000101 0111 1111 0000 0110 1000 0101double 类型就要加 0111 1111 111 0000 0000 1100 1000 0101 1111 0110 0000 0000 0000 0000100 0010 1111 1011 0000 0000 0000 00000x42 fb 00 00小端存储 00 00 fb 42
返回列表