| |
|
开发:
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. 数据类型详细介绍到目前为止,我们已经掌握了C语言的基本内置类型,如下:
每一种数据类型的大小不同,这也就决定了它所存储的数据范围也就不同,就比如char和int所存储的数据范围就不同,那么具体能存储多少呢?相信大家看完本本章内容,就能对每一种数据是怎么存储在内存中的,就会有了更加深刻的认识。 首先,在C语言里我们把类型分为以下几种:1、整数类型 2、浮点型 整数类形
在这里,unsigned是表示无符号类型,signed表示有符号类型,所谓无符号类型就是这个数没有负数,只有正数和0,而有符号就表示这个数有正有负,大家来看这么一个例子:
浮点型
具体区别会在后面讲到 构造类型构造类型又叫自定义类型,主要包括:数组、结构体类型(struct)、枚举类型(enum)、联合类型(union)
指针类型
这里需要注意一点,就是void*,它可以接受任意类型的指针,就像一个垃圾桶一般,char*,int*,short*等都可以接受,但是,正是因为啥都可以接收,所用它不能直接解引用,或者进行指针的运算,毕竟我们不确定到底接受的是几个字节。 如果想要对void*类型进行解引用或者运算的话,必须先强制类型转换,才可以使用,如下:
空类型空类型经常用到函数的返回类型以及函数参数中
了解这些内容后,接下来开始讲解整形在内存中是如何存储的 2. 整形在内存中的存储我们知道,任何变量的创建都需要在内存中开辟一块空间,空间的大小是由它们的类型决定,那么,这些数据是如何在内存中存储的呢?且听以下讲解 原码、反码、补码计算机中的整数有三种2进制表示方法,即原码、反码和补码。 原码 整形存储补码的原因对于整形来说:数据存放内存中其实存放的是补码。 为什么说补码与原码相互转换,其运算过程是相同的呢?
3. 大小端字节序介绍及判断我们知道,整形在内存中存储的是补码,大家再来看,假如要存储-10
然而通过调试我们发现,存储的是f6 ff ff ff,这是为什么呢?这里就涉及到了大小端字节序的存储 大家可以看到,这里vs的存储模式就是小端存储,因为它把低位的数据存储到内存的低地址,把高位存储在高地址。这里万万不可写成6f ff ff ff ,因为f 6占一个字节。 练习题(含笔试题)习题1:
思路:这里我们只需要知道它的低地址处存储的是不是低位的数据,就可以判断是不是大小端了,就比如,如果是个int类型的数字,1,它的存储的补码为:00 00 00 01(16进制方便调试观察),低地址假如是01,就说明是小端,反之大端。完整答案如下: 小端字节序存储:把一个数值的低位字节内容存放到内存低地址处,高位字节内容存放到内存高地址处。
习题2:
所以,最终的结果为-1 -1 255 习题3:
%u:打印无符号整型,认为内存中存放的补码对应的是一个无符号数。 -128存储在内存中的补码为1000 0000(截断),打印无符号整数时,整型提升,char为有符号数,高位补符号位,即11111111 11111111 11111111 10000000,由于是打印无符号的整型,所以就是打印这个数对应的十进制
习题3:
这里的a在内存中存储的是1000 0000(截断),打印时高位补符号位,这里由于发生了截断,符号位变成了1,所以整形提升后的补码为:11111111 11111111 11111111 10000000,打印结果依然是那个很大的数字。
习题4:
习题5:
这里,我们注意,i为无符号整型,前面正常打印,9 8 7 6 5 4 3 2 1 0,但是当i=0的时候,执行完打印命令后还会进行i- -,i此时变成了-1,注意!i是无符号整形,-1对应的无符号整数是一个很大的正数,所以循环还会一直进行下去,陷入死循环!
4. 浮点型在内存中的存储像float、double、long double…都属于浮点型,接下来将探究浮点型是如何在内存中存储的。 先来看这样一段代码:
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式: 具体是什么意思呢? 举例来说: IEEE 754规定: 什么意思呢?具体如下: IEEE 754对有效数字M和指数E,还有一些特别规定。 前面说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。 举个例子,也就是说,在存储5.5即101.1时,M=1.011,但是存储时只存储1后面的011,等读取的时候,再给011加上1即可1.011 至于指数E,情况就比较复杂。 举个例子,假如存储float 5.5,还有double -5.5,应该这样存储:
由此可见,确实如此! 首先S=0,E-127得到2,然后再011前面加个1,即1.011 2、E全为0 因为-127+127才等于0,也就是00000000,即E=-127,也就是说原本的数是写成x.xxx*2^-127,这个数已经非常非常非常非常小了,2的-127次方,无限趋近于0 3、E全为1 大家来想一下,128+127=255,也就是E全为1,即11111111,也就是说E=128,即原来的数是x.xx*2^128,这个数如果是正数,就超级超级超级大,趋近于正无穷,如果是个负数,就非常非常小,趋近于负无穷! 学完后我们回过头来再来看那个题:
第二个打印,这里pFloat指向的是n的地址,也就是这个二进制数,而以浮点型的视角来看待这块二进制数,这里的0就表示S,00000000表示E,后面的表示M, 后面pFloat=9.0,这里我们写出它存储的二进制位 第四个打印是以%f打印,打印浮点型小数,所以打印结果还是9.0 因此,输出结果为:9 望诸君加油,不负自己! |
|
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图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 12:52:47- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |