网站权重怎么查询,淘宝联盟怎么建设网站,上海哪家公司做网站最好,室内设计效果图展板文章目录 一、整数在内存中的存储二、⼤⼩端字节序和字节序判断1、什么是⼤⼩端#xff1f;2、为什么有⼤⼩端?3、练习1#xff09;练习12#xff09;练习23#xff09;练习34#xff09;练习45#xff09; 练习56#xff09;练习6 三、浮点数在内存中的存储1、浮点数的… 文章目录 一、整数在内存中的存储二、⼤⼩端字节序和字节序判断1、什么是⼤⼩端2、为什么有⼤⼩端?3、练习1练习12练习23练习34练习45 练习56练习6 三、浮点数在内存中的存储1、浮点数的存储1浮点数存的过程2浮点数取的过程 2、题⽬解析 一、整数在内存中的存储
在讲解操作符的时候我们就讲过了下⾯的内容 整数的2进制表⽰⽅法有三种即原码、反码和补码 有符号的整数三种表⽰⽅法均有符号位和数值位两部分符号位都是⽤0表⽰“正”⽤1表 ⽰“负”最⾼位的⼀位是被当做符号位剩余的都是数值位。
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同 原码直接翻译成⼆进制 反码原码符号位不变其他取反 补码反码1
对于整形来说数据存放内存中其实存放的是补码。 为什么呢在计算机系统中数值⼀律⽤补码来表⽰和存储。
原因在于 使⽤补码可以将符号位和数值域统⼀处理。 同时加法和减法也可以统⼀处理CPU只有加法器此外补码与原码相互转换其运算过程是 相同的不需要额外的硬件电路。
二、⼤⼩端字节序和字节序判断
当我们了解了整数在内存中存储后我们调试看⼀个细节
#include stdio.hint main()
{int a 0x11223344;//0x是十六进制11 22 33 44是四个字节共同组成了一个内存单元也就是一个整型举例1return 0;
}调试的时候我们可以看到在a中的 0x11223344 这个数字是按照字节为单位倒着存储的。这是为 什么呢 在这里有些额外知识需要注意
1.整数在内存中存储的是二进制的补码
2.在调试窗口中观察内存的时候为了方便展示显示的是16进制的值
3.存储的顺序是倒过来的1、什么是⼤⼩端
其实超过⼀个字节的数据在内存中存储的时候就有存储顺序的问题按照不同的存储顺序我们分为⼤端字节序存储和⼩端字节序存储下⾯是具体的概念
首先在整数123中3就被叫做个位也就是低位
同理在内存中
0x11223344 右边的字节就是低位11 22 33 44
低地址 高地址 大端字节序存储
大端字节序存储把一个数据的低位字节的内容存储到高地址处把高位字节的内容存储到低地址处(按顺序)44 33 22 11
低地址 高地址 小端字节序存储
小端字节序存储把一个数据的低位字节的内容存储到低地址处把高位字节的内容存储到高地址处(倒反天罡)我们可以设计一个小程序来判断当前机器的字节序
0x 00 00 00 01 这是整数1的十六进制 我们可以观察其内存来验证 01 00 00 00 (反) 小端字节序 00 00 00 01 大端字节序
int main()
{int n 1;if (*(char*) n 1)printf(小端\n);elseprintf(大端\n);return 0;
}运行结果是小端 说明计算机中储存1的内存是01 00 00 00
2、为什么有⼤⼩端?
为什么会有⼤⼩端模式之分呢
这是因为在计算机系统中我们是以字节为单位的每个地址单元都对应着⼀个字节⼀个字节为8bit位但是在C语⾔中除了8 bit的 char之外还有16 bit的 short型32 bit的 long 型要看具体的编译器另外对于位数⼤于8位的处理器例如16位或者32位的处理器由于寄存器宽度⼤于⼀个字节那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了⼤端存储模式和⼩端存储模式。
例如⼀个 16 bit 的 short 型 x 在内存中的地址为 0x0010 x 的值为 0x1122 那么0x11 为⾼字节 0x22 为低字节。对于⼤端模式就将 0x11 放在低地址中即 0x0010 中0x22 放在⾼地址中即 0x0011 中。⼩端模式刚好相反。我们常⽤的 X86 结构是⼩端模式
3、练习
1练习1
请简述⼤端字节序和⼩端字节序的概念设计⼀个⼩程序来判断当前机器的字节序。10分-百度笔 试题
//代码1 #include stdio.hint check_sys()
{int n 1;/*if (*(char*)n 1)return 1;elsereturn 0;*/return *(char*)n;
}
int main()
{int ret check_sys();if (ret 1)printf(小端\n);elseprintf(大端\n);return 0;
}在练习下面知识前我们需要补充一点知识 signed char a; 有符号的
unsigned char b; 无符号的
char - 1个字节 - 8bit位
如果是signed char类型那么内存中的最高位就被当作符号位00000000 000000001 1
正数 00000010 2 这些存的字节都是补码,正数原反补相同00000011 3 00000100 400000101 5...01111111 127100000000 11111111 10000000 -12810000001 11111110 11111111 -127 负数的补码取反1变成原码负数 ...11111110 10000001 10000010 -211111111 10000000 10000001 -1补 取反 原signed char类型的取值范围是-128~127unsigned char的内存:不看符号位当成数计算,都是正的正数的原反补都是相同的
00000000 0
00000001 1
00000010 2
00000011 3
00000100 4
...
01111111 127
10000000 128
10000001 129
...
11111110 254
11111111 255
unsigned char的取值范围是0~255char 到底是有符号的char 还是无符号的char是取决于编译器的
在vs上charsigned char2练习2
#include stdio.hint main()
{char a -1;signed char b -1;unsigned char c -1;printf(a%d,b%d,c%d, a, b, c);return 0;
}运行结果
解析 int main()
{char a -1;//这是将-1的值赋值给char类型的a//100000000000000000000000000000000001 -1的原码//111111111111111111111111111111111110//111111111111111111111111111111111111 -1的补码//11111111-a char类型只要补码中的8个bit位//111111111111111111111111111111111111 signed类型整型提升补1这是补码//100000000000000000000000000000000001 取反1得到原码-1signed char b -1;//同理也是-1unsigned char c -1;//11111111-c也是同样的8个bit位//000000000000000000000000000011111111 unsigned类型整型提升补0//无符号就是正数原反补相同也就是255printf(a%d,b%d,c%d, a, b, c);//%d意味着要整型提升return 0;
}3练习3
#include stdio.hint main()
{char a -128;printf(%u\n,a);return 0;
}#include stdio.hint main()
{char a 128;printf(%u\n, a);return 0;
}解析
int main()
{char a 128;//128的原码 000000000000000000000000000010000000//正数原反补相同//char类型取8bit位 10000000//整型提升111111111111111111111111111110000000-补//无符号原反补相同和上面一样原码值也一样很大printf(%u\n, a);//%u当成无符号return 0;
}如果%u改成%d就是有符号的计算结果就会不一样了
int main()
{char c -128;printf(%d\n, c);//-128,%d是看成有符号的return 0;
}4练习4
#include stdio.hint main()
{char a[1000]://0~999,signed char类型存放数据的范围是-128~127int i 0;for (i 0; i 1000; i){a[i] -1 - i;//-1-i依次赋值给a[i]}//-1 -2 -3 -4...-127 -128 127 126 ... 4 3 2 1 0 -1 -2...printf(%zd, strlen(a));//求的是字符串的长度统计的是\0(ASCII码值是0)之前的字符个数//255return 0;
}
5 练习5
#include stdio.hunsigned char i 0;
//unsigned char 的取值范围是0~255可以看成一个圈不会出现这个范围外的数字unsigned是无符号的
int main()
{for (i 0; i 255; i)//这里的判断条件是255是恒成立就会无限循环打印{printf(hello world\n);}return 0;
}#include stdio.h
#includewindows.hint main()
{unsigned int i;//无符号说明恒0for (i 9; i 0; i--)//判断条件恒满足死循环{printf(%u\n, i);Sleep(1000);//逐步执行代码}return 0;
}6练习6
#include stdio.h//X86环境 小端字节序
int main()
{int a[4] { 1,2,3,4 };int* ptr1 (int*)(a 1);//a的类型是int(*)[4],int*强制类型转换说明a1之后变为了整型指针ptr1只能变换一个整型int* ptr2 (int*)((int)a 1);//int强制类型转换a为整型1就只能变换一个字节int*强制类型转换为指针ptr2,也只能变换一个整型printf(%x,%x, ptr1[-1], *ptr2);return 0;
}解析 ptr1a a1 1 2 3 4
ptr1[-1]*(ptr1-1)//ptr1向前移动一个字节 就是4(int)a说明a只能变换一个字节了1是向后跳一个字节a:01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
跳过一个字节后的整型就是00 00 00 02
按照小端字节序那么内存中应该是 02 00 00 00
三、浮点数在内存中的存储
常⻅的浮点数3.14159、1E10等浮点数家族包括 float、double、long double 类型。 浮点数表⽰的范围 float.h 中定义 整数的取值范围limits.h
练习
#include stdio.hint main()
{int n 9;float* pFloat (float*)n;//将n的地址赋值给指针变量pFLoatprintf(n的值为%d\n, n);//9printf(*pFloat的值为%f\n, *pFloat);//0.000000*pFloat 9.0;printf(num的值为%d\n, n);//1091567616printf(*pFloat的值为%f\n, *pFloat);//9.000000return 0;
}运行结果 说明:整数和浮点数在内存中的存储方式是有不一样的就像不同国家对同一个东西的理解不同
1、浮点数的存储
上⾯的代码中 num 和 *pFloat 在内存中明明是同⼀个数为什么浮点数和整数的解读结果会差别这么⼤ 要理解这个结果⼀定要搞懂浮点数在计算机内部的表⽰⽅法。 根据国际标准IEEE电⽓和电⼦⼯程协会754任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式 V (−1)S * M * 2E
•(−1)S表⽰符号位当S0V为正数当S1V为负数
• M表⽰有效数字M大于等于1小于2
• 2E表⽰指数位
举例来说 ⼗进制的5.0写成⼆进制是 101.0 相当于 1.01×22 。
那么按照上⾯V的格式可以得出S0M1.01E2。 ⼗进制的-5.0写成⼆进制是 -101.0 相当于 -1.01×22 。那么S1M1.01E2。
IEEE 754规定 对于32位的浮点数最⾼的1位存储符号位S接着的8位存储指数E剩下的23位存储有效数字M 对于64位的浮点数最⾼的1位存储符号位S接着的11位存储指数E剩下的52位存储有效数字M
1浮点数存的过程
IEEE 754对有效数字M和指数E还有⼀些特别规定。 前⾯说过 1≤M2 也就是说M可以写成 1.xxxxxx 的形式其中xxxxxx 表⽰⼩数部分。 IEEE 754规定在计算机内部保存M时默认这个数的第⼀位总是1因此可以被舍去只保存后⾯的xxxxxx部分。⽐如保存1.01的时候只保存01等到读取的时候再把第⼀位的1加上去。这样做的⽬的是节省1位有效数字。以32位浮点数为例留给M只有23位将第⼀位的1舍去以后等于可以保存24位有效数字。
⾄于指数E情况就⽐较复杂 ⾸先E为⼀个⽆符号整数unsigned int
这意味着如果E为8位它的取值范围为0 ~ 255如果E为11位它的取值范围为0~2047。但是我们知道科学计数法中的E是可以出现负数的所以IEEE 754规定存⼊内存时E的真实值必须再加上⼀个中间数对于8位的E这个中间数是127对于11位的E这个中间数是1023。⽐如210的E是10所以保存成32位浮点数时必须保存成10127137即10001001。
2浮点数取的过程
指数E从内存中取出还可以再分成三种情况 E不全为0或不全为1
这时浮点数就采⽤下⾯的规则表⽰即指数E的计算值减去127或1023得到真实值再将有效 数字M前加上第⼀位的1。 ⽐如0.5的⼆进制形式为0.1由于规定正数部分必须为1即将⼩数点右移1位则为1.0*2(-1)其 阶码为-1127(中间值)126表⽰为01111110⽽尾数1.0去掉整数部分为0补⻬0到23位 00000000000000000000000则其⼆进制表⽰形式为:
0 01111110 00000000000000000000000E全为0: 说明E1270 所以E-127则原值是一个非常小的数字这时E等于1-127-126或者 1-1023-1022表示±0
0 00000000 00100000000000000000000E全为1: 则E127255说明E128表示±无穷大
0 11111111 000100000000000000000002、题⽬解析
下⾯让我们回到⼀开始的练习 先看第1环节为什么 9 还原成浮点数就成了0.000000 9以整型的形式存储在内存中得到如下⼆进制序列
0000 0000 0000 0000 0000 0000 0000 1001⾸先将 9 的⼆进制序列按照浮点数的形式拆分得到第⼀位符号位s0后⾯8位的指数E00000000 最后23位的有效数字M00000000000000000001001。 由于指数E全为0所以符合E为全0的情况。因此浮点数V就写成 V(-1)0 × 0.00000000000000000001001×2(-126)1.001×2(-146)
显然V是⼀个很⼩的接近于0的正数所以⽤⼗进制⼩数表⽰就是0.000000。
再看第2环节浮点数9.0为什么整数打印是 1091567616 ⾸先浮点数9.0等于⼆进制的1001.0即换算成科学计数法是1.001×23 所以9.0 (−1)0 *(1.001)*23
那么第⼀位的符号位S0有效数字M等于001后⾯再加20个0凑满23位指数E等于3127130 即10000010 所以写成⼆进制形式应该是SEM即
0 10000010 001 0000 0000 0000 0000 0000这个32位的⼆进制数被当做整数来解析的时候就是整数在内存中的补码原码正是1091567616 。
解析 文章转载自: http://www.morning.pqsys.cn.gov.cn.pqsys.cn http://www.morning.trhrk.cn.gov.cn.trhrk.cn http://www.morning.lbrrn.cn.gov.cn.lbrrn.cn http://www.morning.tnyanzou.com.gov.cn.tnyanzou.com http://www.morning.ndyrb.com.gov.cn.ndyrb.com http://www.morning.rwjfs.cn.gov.cn.rwjfs.cn http://www.morning.lksgz.cn.gov.cn.lksgz.cn http://www.morning.lctrz.cn.gov.cn.lctrz.cn http://www.morning.bflwj.cn.gov.cn.bflwj.cn http://www.morning.glxmf.cn.gov.cn.glxmf.cn http://www.morning.pszw.cn.gov.cn.pszw.cn http://www.morning.tjmfz.cn.gov.cn.tjmfz.cn http://www.morning.nwcgj.cn.gov.cn.nwcgj.cn http://www.morning.mytmn.cn.gov.cn.mytmn.cn http://www.morning.hbdqf.cn.gov.cn.hbdqf.cn http://www.morning.phgz.cn.gov.cn.phgz.cn http://www.morning.gqtw.cn.gov.cn.gqtw.cn http://www.morning.lrzst.cn.gov.cn.lrzst.cn http://www.morning.cpljq.cn.gov.cn.cpljq.cn http://www.morning.wpqcj.cn.gov.cn.wpqcj.cn http://www.morning.nnrqg.cn.gov.cn.nnrqg.cn http://www.morning.tpmnq.cn.gov.cn.tpmnq.cn http://www.morning.chzbq.cn.gov.cn.chzbq.cn http://www.morning.jrqw.cn.gov.cn.jrqw.cn http://www.morning.gqfbh.cn.gov.cn.gqfbh.cn http://www.morning.lpmdy.cn.gov.cn.lpmdy.cn http://www.morning.lqytk.cn.gov.cn.lqytk.cn http://www.morning.zfcfk.cn.gov.cn.zfcfk.cn http://www.morning.xwgbr.cn.gov.cn.xwgbr.cn http://www.morning.wrqw.cn.gov.cn.wrqw.cn http://www.morning.linzhigongmao.cn.gov.cn.linzhigongmao.cn http://www.morning.qdbcd.cn.gov.cn.qdbcd.cn http://www.morning.srxhd.cn.gov.cn.srxhd.cn http://www.morning.djpzg.cn.gov.cn.djpzg.cn http://www.morning.mfqmk.cn.gov.cn.mfqmk.cn http://www.morning.dnycx.cn.gov.cn.dnycx.cn http://www.morning.tlrxp.cn.gov.cn.tlrxp.cn http://www.morning.wkrkb.cn.gov.cn.wkrkb.cn http://www.morning.dfmjm.cn.gov.cn.dfmjm.cn http://www.morning.jklns.cn.gov.cn.jklns.cn http://www.morning.gpcy.cn.gov.cn.gpcy.cn http://www.morning.ypbp.cn.gov.cn.ypbp.cn http://www.morning.ntqgz.cn.gov.cn.ntqgz.cn http://www.morning.dwfzm.cn.gov.cn.dwfzm.cn http://www.morning.dqcpm.cn.gov.cn.dqcpm.cn http://www.morning.gxcit.com.gov.cn.gxcit.com http://www.morning.xylxm.cn.gov.cn.xylxm.cn http://www.morning.yrccw.cn.gov.cn.yrccw.cn http://www.morning.slwqt.cn.gov.cn.slwqt.cn http://www.morning.snxbf.cn.gov.cn.snxbf.cn http://www.morning.hrypl.cn.gov.cn.hrypl.cn http://www.morning.ymyhg.cn.gov.cn.ymyhg.cn http://www.morning.ctsjq.cn.gov.cn.ctsjq.cn http://www.morning.fjscr.cn.gov.cn.fjscr.cn http://www.morning.hlnys.cn.gov.cn.hlnys.cn http://www.morning.btlsb.cn.gov.cn.btlsb.cn http://www.morning.glwyn.cn.gov.cn.glwyn.cn http://www.morning.kxbdm.cn.gov.cn.kxbdm.cn http://www.morning.qtqk.cn.gov.cn.qtqk.cn http://www.morning.ychrn.cn.gov.cn.ychrn.cn http://www.morning.rshs.cn.gov.cn.rshs.cn http://www.morning.hxlpm.cn.gov.cn.hxlpm.cn http://www.morning.yqpck.cn.gov.cn.yqpck.cn http://www.morning.nkhdt.cn.gov.cn.nkhdt.cn http://www.morning.ahlart.com.gov.cn.ahlart.com http://www.morning.gassnw.com.gov.cn.gassnw.com http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.lrdzb.cn.gov.cn.lrdzb.cn http://www.morning.gnmhy.cn.gov.cn.gnmhy.cn http://www.morning.zcfsq.cn.gov.cn.zcfsq.cn http://www.morning.pangucheng.cn.gov.cn.pangucheng.cn http://www.morning.kabaifu.com.gov.cn.kabaifu.com http://www.morning.mspkz.cn.gov.cn.mspkz.cn http://www.morning.ktyww.cn.gov.cn.ktyww.cn http://www.morning.xstfp.cn.gov.cn.xstfp.cn http://www.morning.kjyfq.cn.gov.cn.kjyfq.cn http://www.morning.jxfmn.cn.gov.cn.jxfmn.cn http://www.morning.jfxdy.cn.gov.cn.jfxdy.cn http://www.morning.kcrw.cn.gov.cn.kcrw.cn http://www.morning.gqtxz.cn.gov.cn.gqtxz.cn