| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C语言 - 深度剖析数据在内存中的存储 -> 正文阅读 |
|
[C++知识库]C语言 - 深度剖析数据在内存中的存储 |
1. 整型在内存中的存储:原码,反码,补码。 2. 举例说明整型表示范围的计算方法 3. 大小端字节序介绍及判断 4. 习题 5. 浮点型在内存中的存储解析 1. 整型在内存中的存储: 原码,反码,补码各类整形的基本介绍:
整型在内存中的存储
? 如图,我们可以看到,确实如此。 2. 举例说明整型表示范围的计算方法
?图二与上方类似,即short范围的计算方法 3. 大小端字节序介绍及判断
写一个程序用于判断当前存储模式为小端还是大端。? ? ?以上程序结果显示都是小端,表示判断方法无误 5. 习题1.? 如图,常量-1为int类型 原码:10000000000000000000000000000001 反码:1111111111111111111111111111111111110 补码:1111111111111111111111111111111111111 内存中存储的是补码,而int型的-1占32bit位,而char只占8bit位,所以要发生截断,末尾的11111111存入char a中。 a中存储的是11111111下面打印时用%d打印的,%d为有符号的十进制整数形式,而a为char型,所以要进行整型提升。 整型提升规则:有符号高位补符号位,无符号的高位补0 所以提升之后为?1111111111111111111111111111111111111? 而%d是打印有符号的,而这段二进制序列最高位为1,表示负,而负数原反补不相同,所以要进行转化。原码为100000000...0001即-1 所以打印出来是-1。 而signed char b与char a是相同的,所以也是-1? 最后来看unsigned char c:-1的补码仍然要发生截断,存入c中为11111111? 打印时仍然为%d 所以要进行整型提升,根据规则,无符号的整型提升时高位补0,即00000000000000000000000011111111 按照%d打印时,为有符号的十进制整数,符号位为0,即正数,正数的原反补相同,原码00000000000000000000000011111111即255 所以打印出来是255 progress:-1的补码 -> 截断存入 -> 打印时整型提升 -> 根据提升之后的补码找出原码 -> 打印 2.?和第一题一样。 -128原码:10000000000000000000000010000000 -128反码:11111111111111111111111101111111 -128补码:11111111111111111111111110000000 截断:10000000 整型提升:11111111111111111111111110000000 %u - 无符号的十进制整数:所以提升之后全部都是数值位 总结:整型提升看它本身是什么类型:无符号还是有符号,打印的时候是要看打印的形式,而不是只有补码决定。 3.
int型128原反补相同 -> 截断 -> 因为%u -> 所以整型提升(有符号的char,高位补符号位) ->? %u为无符号,所以全是数值位 -> 转化为十进制即4294967168。 4.? 直接用补码进行相加,因为打印的是%d,而补码的高位又是1,所以为负数,负数原反补不同,所以要找出原码,转化为十进制即-10?? 5.unsigned int 一定>=0 所以程序一定死循环,下面说打印的内容: 9876543210存入i中都没问题(正数原返补相同),当i=-1时。-1的补码为全1,打印出来即2^32-1。?11111111111111111111111111111111 ? ?i=-2时 -2的原反补:10000000000000000000000010 111111111111111111111111111111101 1111111111111111111111111110? 也就是-1的补码减一。后面数字一直减小,到9876...3210又会进入新的循环。 6.其实这个和上面的题本质上没什么区别,最开始char数字中存入-1,然后存入-2,要知道-1的补码为全1,截取8bit位,为11111111,后面减一,变成11111110,11111101...如下图所示,就是从右上表格的下边往上变化,也就是那个圈的顶逆时针旋转,当这8bit位一直减小,到00000000 即0时也就是'\0'? 标志着这个数组到此为止,即前面共255个字符 ? ?5. 浮点型在内存中的存储解析浮点数在计算机内部的表示方法 : 根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式: (-1)^S * M * 2^E (-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。 M表示有效数字,大于等于1,小于2。 2^E表示指数位。(如果是十进制数字则为*10^x次,这里是2进制,所以底数为2) 举例来说: 十进制的5.0,写成二进制是 101.0 ,相当于 1.01×2^2 。 那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。 十进制的-5.0,写成二进制是 -101.0 ,相当于 -1.01×2^2 。那么,s=1,M=1.01,E=2。 IEEE 754规定: 对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。 对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。? IEEE 754对有效数字M和指数E,还有一些特别规定。 前面说过, 1≤M<2 ,也就是说,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。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即 10001001。 然后,指数E从内存中取出还可以再分成三种情况: E不全为0或不全为1 : 这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将 有效数字M前加上第一位的1。 比如: 0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为 1.0*2^(-1),其阶码为-1+127=126,表示为 01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:?0 01111110 00000000000000000000000 E全为0 : 这时,浮点数的指数E等于1-127(或者1-1023)即为真实值, 有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于 0的很小的数字。 E全为1 : 这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s) (复制的) 验证: ?一个题
? ?int型9转化为补码,在第一次*pFloat访问时,是以浮点数的角度访问并解析的,所以也就是从二进制提取出浮点数的模式,变为SEM的形式之后,算出SEM分别是多少,也就求出了这个小数。 *pFloat = 9.0 即把9.0这个小数存入到对应空间中,9.0要转化为二进制的形式,使用的就是IEE754的规定,转化为二进制之后,即内存中存储的就是这样一个二进制序列,下面的第一个printf打印时,是以%d,即有符号的十进制整数打印的,转化为十进制之后就是1091567616,而以9.0转化的二进制序列存入,下面又以%f形式打印,所以也就出现了9.000000 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:56:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |