| |
|
开发:
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语言中各类型的内存存储 |
目录 目前已经学了的数据类型:
其中还有布尔类型:(但是布尔类型在c99中才引入)
要进行内存存储的学习,我们要先把学过的类型做以下分类讨论: 整型家族? 整型家族中的每个类型又分为有无符号类型,而以下的类型都默认为:
但char≠signed char,要取决于编译器,常见的编译器下都是char===》signed char 我们都知道无符号数不能存储有符号的数字,但请看下面的代码:
此时输出的依然是10? ? ?-10,为什么呢? 是因为我们用有符号数的方式打印出来了无符号数,且把有符号数字赋给了无符号数,此时只能打印出有符号了。 unsigned int也是四个字节存储空间,于是使用%d的时候就可以用有符号数的形式输出了。 应该改为:
此时的输出结果才正确: ? 为什么会有这么大的差异?我们这里先保有一些疑惑。 浮点型家族:
构造类型(自定义类型):
指针类型:
空类型:
? 整型的内存存储输入下列代码并按下f10运行后:
在调试器的内存窗口中我们可以看到如下: ? 我们都知道a是用四个字节空间存储的,那么a是以怎样的方式进行存储的呢? 原码 反码 补码整数在计算机中都是以二进制形式的原码,反码,补码的方式表示的。 三种表示方法都有符号位和数值位的概念,最高位上若为0,则表示为正数,若最高位上为1,则为负数。 内存中是以二进制的补码来存储的。 原码:二进制原本的样子 反码:将符号位保留,数值位上的其他位数全部取反 补码:在反码基础上将最低位+1,便得到补码。 (Tip:在这里要注意反码与学习的“~”按位取反操作符不同,按位取反是将二进制(包括符号位)上的所以位置都取反,而反码是符号位不变,其他为按位取反。) 而正数与负数的原、反、补码并不相同: Q:整数为什么在内存中以补码的形式存在? 计算器中只有加法器。 计算器中是无法计算1-1的,而只能用1+(-1)的方式来计算。 下面让我们来验证此时整型在运算中是以原、反、补码哪种方式进行运算的。 若为原码: 若为补码: ? ?通过验证,我们可以知道运用补码运算才是正确的结果,而原、补码的转换也相对容易:原码→补码(取反、+1) 补码→原码(也是取反、+1) 所以,计算机中整型以补码形式存在并进行运算。 ? ?创造一个变量int a=0x11223344,运行后打开编译器的内存窗口,我们会发现内存窗口中并不是以11223344的顺序存储的,这是为什么呢?这就相关大小端字节序的问题了。
? 大小端字节序在我们创造一个变量int a=0x11223344时,打开我们的内存窗口,会发现并不是以11223344的顺序存储的,这是为什么呢?这就相关大小端字节序的问题了。 ? 大端字节序存储:低字节的数据存放在高地址处,高字节的数据存放在低地址处。 小端字节序存储:高字节的数据存放在高地址处,低字节的数据存放在低地址处。 Q:为什么会有大小端字节序之分?(以下来源于百度出的内容) 作者:starmier 来源:简书 这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个 在搜索大小端字节序相关知识的时候,偶然发现了一道十分有趣的题目,想在这里记录下: 百度神奇题目:简述大小端字节序的概念,并写一个小程序来判断大小字节序。
Q:char类型有字节序么? A:无,因为char只有一个字节大小,而字节序表示的是字节的排列顺序,所以char类型没有字节序。 有关字节存储的相关练习:but 在做题前先认识两个东西:整型提升与整型截断。 整型截断比如说char占1个字节,int 占4个字节,当强制将int 赋给char时就会截短,只将4字节的最后的一个字节给char 整型提升若原本整型家族的类型中的一个变量所占的字节比int少,那么在以int形式使用时要发生整型提升。 整型提升的规则:
看以下例题:?
? ?
最终输出结果: ? 再来看下面代码的输出结果:?
最终输出结果: ?为什么这里会最终输出255呢?这里便涉及了char类型变量能存储的数值范围。 探讨:一个char类型的变量到底能存放什么数值? unsigned char:从0到255后再回到0 signed char:从0到128到-1到-127再回到0 ? ? **Tip:**当我们遇到10000000时直接解析为128,因为就算我们将原码转为补码后也依然会是10000000 在这里推荐一个头文件:<limits.h> 头文件:#include <limits.h>点开里面可以查各种类型的取值范围
? 浮点类型在内存中的存储常见浮点类型: 3.14159? ? ? ? ? 1E10(代表1×10的-10次方) 浮点数表示范围可以用<float.h>打开来看
(无论是%f还是%lf默认都是由小数点后6个0,编译器决定的) 小数的二进制表示方式:IEEE 754根据国际标准IEEE(电气电子工程师学会)754,任意一个二进制浮点数可以表示成下面的形式:
现在拿5.5来举例: 将5.5转换为二进制后表示为101.1→1.0112^2→(-1)^01.011*2^2 此时S=0,M=1.011,E=2。计算机只需要把这三个值给存储起来便可以存储浮点数了。 那么关于S、M、E具体是如何存储的呢?以下是S、M、E的存储细则: ? ? 依照规定,E是无符号整型,而在存-1时在32位上是126,在64位上存的是1023,但是当E为负数时,又该如何表示? 例如0.5,转换为二进制后变为1.0*2^-1 为了阻止这种情况出现,IEEE754规定E的真实值必须加上一个中间数,对于8位的E,这个中间数就是127;对于11位的E来说,中间数为1023 所以1.0*2^-1中的E应该由-1→126,作为126存储在内存空间中 指数E取出的三种情况:E不全为1或不全为0 这时浮点数就采用将E减去127或1023后得到真实值,再将M的前面加上第一位1。 E为全0 由于E-127后得到的真实值是-127,则指数为-127,此时此时有效数字M不再加上第一位的1,而是还原为0.xxxxx的小数。这样做是为了表示+-0,以及接近于0的很小的数字 E全为1 则真实值非常大,此时表示为+-∞ 学了上述浮点数存储知识后,自己来试一下对上述程序输出结果预测是否正确吧~ ? |
|
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 6:34:38- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |