| |
|
开发:
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++知识库]# 数据类型及存储 |
## 目录 ### 1.数据类型 #### 1.1基本的内置类型 | 类型 ? ? ?| 含义 ? ? ? ? | 所占空间大小/字节 | #### 1.2构造类型 数组类型 ? ? ?//arrey 结构体类型 ?//struct 枚举类型 ? ? //enum 联合类型 ? ?//union #### 1.3指针类型 ?*p **每种数据类型都可以定义其指针** eg. ? int* char* ?float* ?struct* ?void* #### 1.4空类型 void ? 无类型//常用于函数返回类型、函数参数、指针类型 ### 2.数据在内存中的存储 **我们知道:一个变量的创建过程就是在内存中开辟空间,空间的大小由其类型决定** #### 2.1整形家族 看两个例子 ```c a 和 b均占4个字节,具体存储如下: ![QQ截图20211003191415](D:/Typora/%E5%8D%9A%E5%AE%A2%E5%92%8C%E7%AC%94%E8%AE%B0/QQ%E6%88%AA%E5%9B%BE20211003191415-16332597517241.png) 03 00 00 00 ##### 2.1.1原码,反码,补码 计算机中的整数有三种表示方法:原码、反码、补码,均有**符号位**和**数值位**两部分。’0‘为正,’1‘为负。 正数 :原码反码补码相同,均为其对应2进制 | 10进制数 | 正数 | 对应二进制数 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | 负数: 原码:直接转换为其二进制 补码:符号位不变,其他位次取反 补码:反码+1 | 10进制数 | 负数 | 对应二进制数 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | 对比上面的内存图,可以发现,整形数据类型存储的是**补码**的16进制形式,但是顺序好像不太对,为什么呢? 这是由编译器模式决定的,X86为小端模式 ![image-20211003200046678](D:/Typora/%E5%8D%9A%E5%AE%A2%E5%92%8C%E7%AC%94%E8%AE%B0/image-20211003200046678-16332624517642.png) ##### 2.1.2大小端模式 ###### 2.1.2.1大小端字节序产生的原因 在计算机系统中,**地址以字节为单位的**,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,**由于寄存器宽度大于一个字节**,那么必然存在着一个**如何将多个字节安排**的问题。因此就导致了**大端存储模式**和**小端存储模式**。 ###### 2.1.2.2写个程序判断当前编译器为大端模式还是小端模式 ? ? ```c #### 2.2浮点型家族 ##### 2.2.1基本概念 常见浮点型数 3.14159 1E10 根据国际标准IEEE(电气和电子工程协会) 754, 任意一个二进制浮点数**V**可以表示成下面的形式: **V=(-1)^S * M * 2^E** (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。 M表示有效数字,1<=M<2 2^E表示指数位。 | 单位:bit ? ?| S符号位 | E指数位 | M有效位 | **M** ?1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分 在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。 **E**(unsigned int) float ?E有8bit,可以·表示0-255;double E有11bit,可以表示0-2047。但实际情况中指数可以为负数,引入一个中间数,并规定:对于float的E,其值为真实值加上中间数127;对于double的E,其值为真实值加上中间数1023; 例如 2^10 ? E=10+127=137;存储形式10001001; 分为以下三种情况 **1.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 | **2.E全为0** 这时,浮点数的指数E等于**1-127(或者1-1023)**即为真实值, 有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。 **3.E全为1** 这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s); ##### 2.1.2练习 ```c 9 (16进制) ? 0x 0000 1001 ? ? ? ? ? ? ? ? ? ? ? ? ? S=0;E=0;M=1001; *pFloat ? ?按照位数补齐(1+8+23) ? ? ? ? ? ? 0|000,0000,0|000,000,000,0000,0000,1001 ?写成规定形式为 (-1)^0**0.000,000,000,0000,0000,1001* *2^(-126) ? =1.001x2^(-146) ? ?是个很小的数,以浮点数形式打印,在float的精度范围内显然是0.000000 9.0 ? 本身就是浮点类型 ? 直接转换 ? 1001.0 ?=(-1)^0**1.001* *2^(3) ? ?S=0;M=1.001,E=3+127=130 ?即 10000010 ? ? ? ? ? ? ? 0|100,0001,0|000,0000,0000,0000,0000,0000 ? ?是个32位整形2进制数,以10进制数形式打印就是1091567616 |
|
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 0:57:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |