农副产品网站建设目标,个人网站论文摘要,医疗网站建设中心,外国平面设计网站有哪些目录
一、整数在内存中的存储
1.存储形式
2.原码、反码和补码
二、大小端字节序和字节序判断
1.什么是大小端#xff1f;
2.为什么有大小端?
3.判断大小端模式
三、浮点数在内存中的存储
1.奇怪的现象
2.浮点数内存存储
2.1指数E的特殊情况
3.回到例题
往期内容…目录一、整数在内存中的存储1.存储形式2.原码、反码和补码二、大小端字节序和字节序判断1.什么是大小端2.为什么有大小端?3.判断大小端模式三、浮点数在内存中的存储1.奇怪的现象2.浮点数内存存储2.1指数E的特殊情况3.回到例题往期内容一、整数在内存中的存储1.存储形式整型数据在内存中存储的是二进制的补码形式,这是计算机中表示整数的标准方式2.原码、反码和补码整数的2进制表⽰⽅法有三种即原码、反码和补码有符号整数的三种表⽰⽅法均有符号位和数值位两部分2进制序列中最⾼位的1位是被当做符号 位剩余的都是数值位。符号位都是⽤0表⽰“正”⽤1表⽰“负”int 类型来说占 4 个字节32 个 bit 位正整数的原、反、补码都相同。负整数的三种表示方法各不相同。原码直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。反码将原码的符号位不变其他位依次按位取反就可以得到反码。补码反码1就得到补码。 补码得到原码也是可以使⽤取反1的操作。⽆符号整数的三种 2 进制表示相同直接将其数值转换为二进制存储没有符号位每⼀位都是数值位。举个栗子对于正数它的原码、反码和补码是完全相同的。所以25的二进制直接表示即可。对于负数转换则遵循特定的步骤以 -25 为例原码最高位符号位为1表示负数。其余位是该数绝对值25的二进制表示。所以-25 的原码是10000000 00000000 00000000 00011001。反码保持符号位1不变将原码的数值位0000000 00000000 00000000 0011001按位取反0变11变0因此-25 的反码是11111111 11111111 11111111 11100110。补码在反码的基础上最低位加1。反码11111111 11111111 11111111 11100110加 1 后得到11111111 11111111 11111111 11100111。数值原码反码补码2500000000 00000000 00000000 0001100100000000 00000000 00000000 0001100100000000 00000000 00000000 00011001-2510000000 00000000 00000000 0001100111111111 11111111 11111111 1110011011111111 11111111 11111111 11100111对于整形来说数据存放内存中其实存放的是⼆进制的补码那这是为什么呢在计算机系统中数值⼀律⽤补码来表⽰和存储。原因在于使⽤补码可以将符号位和数值域统⼀处理同时加法和减法也可以统⼀处理CPU只有加法器此外补码与原码相互转换其运算过程是相同的不需要额外的硬件电路。例如计算1 - 1相当于计算1 (-1)1的补码00000000 00000000 00000000 00000001-1的原码10000000 00000000 00000000 00000001反码11111111 11111111 11111111 11111110补码11111111 11111111 11111111 11111111两者补码相加结果是1 00000000 00000000 00000000 00000000最前面的进位溢出舍弃最终得到0结果正确。二、大小端字节序和字节序判断当我们了解了整数在内存中存储后我们调试看⼀个细节int main() { int a 0x11223344; return 0; }调试的时候我们可以看到在a中的 0x11223344 这个数字是按照字节为单位倒着存储的。这是为什么呢1.什么是大小端其实超过⼀个字节的数据在内存中存储的时候就有存储顺序的问题按照不同的存储顺序我们分为大端字节序存储和小端字节序存储下面是具体的概念大端存储模式 是指数据的低位字节内容保存在内存的⾼地址处而数据的高位字节内容保存在内存的低地址处。小端存储模式 是指数据的低位字节内容保存在内存的低地址处而数据的高位字节内容保存在内存的高地址处。2.为什么有大小端?这是因为在计算机系统中我们是以字节为单位的每个地址单元都对应着⼀个字节⼀个字节为8 bit 位但是在C语⾔中除了8 bit 的 char 之外还有16 bit 的 short 型32 bit 的 long 型要看 具体的编译器另外对于位数大于8位的处理器例如16位或者32位的处理器由于寄存器宽度大于⼀个字节那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。3.判断大小端模式请简述⼤端字节序和⼩端字节序的概念设计⼀个⼩程序来判断当前机器的字节序。10分- 百度笔试题#include stdio.h 因为int a 1 ;中的 a 储存的是0x 00 00 00 01 所以可以将 a 内存中第一个字节取出来判断是 1 还是 0 是 1 就是小端模式否则是大端模式 int check_sys() { int i 1; return (*(char *)i); } int main() { int ret check_sys(); if(ret 1) { printf(⼩端\n); } else { printf(⼤端\n); } return 0; }还有一种联合体的写法int check_sys() { union { int i; char c; }un; un.i 1; return un.c; }三、浮点数在内存中的存储常⻅的浮点数3.14159、1E101E10的完整数学表达式是 1 × 10¹⁰等浮点数家族包括 float、double、long double 类型。 浮点数表示的范围 float.h 中定义。1.奇怪的现象大家可以猜猜代码的运行结果嘻嘻int main() { int n 9; float *pFloat (float *)n; printf(n的值为%d\n, n); printf(*pFloat的值为%f\n, *pFloat); *pFloat 9.0; printf(n的值为%d\n, n); printf(*pFloat的值为%f\n, *pFloat); return 0; }是不是很出乎意料上⾯的代码中 n 和 *pFloat 在内存中明明是同⼀个数为什么浮点数和整数的解读结果会差别这么⼤在这个过程中n就相当于一块空间可以以整数的视角来理解这4个字节也可以以浮点数的视角来理解这4个字节以整数的形式存放然后以整数的形式拿出以浮点数的形式存放然后以浮点数的形式拿出但是我以整数的形式存放以浮点型的方式拿出以浮点数的形式存放以整型的方式拿出结果就不对由此说明整数和浮点数在内存中的存放方式不同2.浮点数内存存储要理解这个结果⼀定要搞懂浮点数在计算机内部的表示⽅法。根据国际标准IEEE电⽓和电⼦⼯程协会 754任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式V (-1)^S * M * 2^ES 表示符号位当S0V为正数当S1V为负数M 表示有效数字是一个大于等于1且小于2的二进制小数。例如二进制下的1.011E 表示2的幂次决定小数点的位置举例来说⼗进制的5.0写成⼆进制是 101.0 相当于1.01* 2^2 。 那么按照上⾯ V 的格式可以得出S0M1.01E2。IEEE 754标准主要定义了两种精度的浮点数格式它们在内存中的位分配如下精度总位数符号位 (S)指数位 (E)尾数位 (M)单精度 (float)32位1位8位23位双精度 (double)64位1位11位52位具体规则如下符号位 (S)直接存储0代表正1代表负指数 (E)E在存储时是一个无符号整数。为了能表示负指数实际存储的是E 偏移值,单精度的偏移值是127双精度是1023例如单精度下真实指数E2存储时就是2127129二进制为10000001有效数字 (M)由于M总是1.XXXXXX的形式整数部分的1是固定的因此存储时只保存小数部分XXXXXX这样可以多出一位有效数字提高精度,读取时再将这个1加上我们以单精度浮点数存储17.625为例转换二进制整数部分17转二进制为10001小数部分0.625转二进制为0.101因为0.625 0.50.125即2^(-1) 2^(-3)所以17.625的二进制是10001.101规范化将二进制数小数点左移4位变为1.0001101 × 2^4。得到S0,M1.0001101,E4。计算存储值符号位 S0阶码 E4127131二进制为10000011尾数 M存储M的小数部分0001101后面用0补足23位得到00011010000000000000000组合最终32位序列为0 10000011 00011010000000000000000。通常我们表示为十六进制0x41 8D 00 00这样的浮点数存储⽅式很巧妙但是我们也要注意到有的浮点数是⽆法精确保存的。⽐如:1.2我们可以在VS上调试看⼀下我们发现会有些许误差2.1指数E的特殊情况E全为0这时浮点数的指数E等于1-127或者1-1023即为真实值有效数字M不再加上第⼀位的1而是还原为0.xxxxxx的小数。这样做是为了表示±0以及接近于0的很小的数字0 00000000 00100000000000000000000E全为1这时如果有效数字M全为0表示±无穷大正负取决于符号位s0 11111111 000100000000000000000003.回到例题int main() { int n 9; float *pFloat (float *)n; printf(n的值为%d\n, n); printf(*pFloat的值为%f\n, *pFloat); *pFloat 9.0; printf(n的值为%d\n, n); printf(*pFloat的值为%f\n, *pFloat); return 0; }我用excel表格做了个图解14相信聪明的你肯定知道我们重点讲一下23第2题取出n的地址再强制类型转换给指针pFloat,再以浮点数形式打印第3题取出 n 的地址再强制类型转换给指针 pFloat 再通过解引用把 n 的值改为 9.0 (浮点数最后以整型形式打印往期内容C语言内存函数使用和模拟memcpy,memmove,memset,memcmp4000字超详解C语言分支和循环语句保姆级讲解0基础也能看懂C语言中传参的本质OK以上就是全部内容了若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持本文有若有不足之处希望各位兄弟们能给出宝贵的意见。谢谢大家本期制作不易希望各位兄弟们能动动小手三连走一走支持一下三连必回0.0