ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

数据在内存中的储存

数据在内存中的储存 整数在内存中的储存整数的二进制表示方法有三种即原码反码补码。有符号的整数三种方法均有符号位和数值位两部分符号位都是用0表示“正”用1表示“负”。最高一位表示符号位剩余的都是数值位。正整数的原反补都相同。负整数的三种表示方法各不相同。原码把数值翻译成二进制形式。反码符号位不变其它按位取反补码反码1对于整形来说数据存放内存中其实存放的是二进制的补码。大小端字节序和字节序判断对于这样a这样的一个变量它在内存中是怎样储存的呢#includestdio.h int main() { int a 0x11223344; return 0; }是不是可以有很多种方法只要我们可以把它还原回去就可以不过我们常用的是1和2后面没规律的纯粹是自己为难自己。在vs2022的环境下我们可以看结果所以vs2022的环境下应该是小端。什么是大小端大端字节序存储如1把一个数据的低位字节的数据存放在高地址处把一个数据的高位字节数据存放在低地址处。小端字节序存储如2把一个数据的低位字节数据放在低地址处把一个数据的高位字节数据存放在高地址处。大端小端都是以字节为单位的。为什么会有大小端之分这是因为在计算机系统中我们是以字节为单位的每个地址单元都对应着⼀个字节⼀个字节为8bit 位但是在C语⾔中除了8 bit 的 char 之外还有16 bit 的 short 型32 bit 的 long 型要看具体的编译器另外对于位数⼤于8位的处理器例如16位或者32位的处理器由于寄存器宽度⼤于⼀个字节那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了⼤端存储模式和⼩端存储模式。浮点数在内存中的储存根据国际标准IEEE745任意一个二进制浮点数V可以表示成下面的形式。V (−1) ^S *M ∗*2^E•(−1)^S 表示符号位当S0V为正数当S1V为负数• M 表示有效数字M是大于等于1小于2的• 2^E 表示指数位eg:十进制的5.0写成二进制是101.0相当于是1.01*2^2按照上面V的格式可以得出S0,M1.01,E2。浮点数存的过程对M的特别规定因为1M2,M一直是1.XXXX 所以在计算机内部默认这个数的第一位总是1可以被舍去只保存小数部分等到读取的时候再加上。对E的特别规定首先E是一个无符号整数unsigned int范围8位0~25511位0~2047但是我们知道科学计数法中的E是可以出现负数的所以存入内存时的E的真实值必须再加入一个中间数8位E12711位E1023浮点数取的过程E不全为0或者不全为1E-127或1023得到真实值再把M前加上第一位的1。E全为0证明 E1270E-127浮点数无限接近于0。E-127或1023为真实值有效数字M不再加上第一位的1而是还原为0.xxxx的小数。这样做是为了表示-0,以及接近0的很小的数字。E全为1证明这个数字很大无限接近于无穷。这时如果有效数字M全为0表示-无穷-取决于符号位S。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进