IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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基本的内置类型

| 类型 ? ? ?| 含义 ? ? ? ? | 所占空间大小/字节 |
| --------- | ------------ | ----------------- |
| char ? ? ?| 字符型 ? ? ? | 1 ? ? ? ? ? ? ? ? |
| short ? ? | 短整型 ? ? ? | 2 ? ? ? ? ? ? ? ? |
| int ? ? ? | 整形 ? ? ? ? | 4 ? ? ? ? ? ? ? ? |
| long ? ? ?| 长整型 ? ? ? | 4 ? ? ? ? ? ? ? ? |
| long long | 长整型 ? ? ? | 8 ? ? ? ? ? ? ? ? |
| float ? ? | 单精度浮点型 | 4 ? ? ? ? ? ? ? ? |
| double ? ?| 双精度浮点型 | 8 ? ? ? ? ? ? ? ? |

#### 1.2构造类型

数组类型 ? ? ?//arrey

结构体类型 ?//struct

枚举类型 ? ? //enum

联合类型 ? ?//union

#### 1.3指针类型 ?*p

**每种数据类型都可以定义其指针**

eg. ? int* char* ?float* ?struct* ?void*

#### 1.4空类型

void ? 无类型//常用于函数返回类型、函数参数、指针类型

### 2.数据在内存中的存储

**我们知道:一个变量的创建过程就是在内存中开辟空间,空间的大小由其类型决定**

#### 2.1整形家族

看两个例子

```c
int a = 3;//正数
int b=-3;//负数
```

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进制数 | 正数 | 对应二进制数 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| -------- | ---- | ------------------------------------------------ |
| 3 ? ? ? ?| 原码 | 0 ?000,0000,0000,0000,0000,0000,0000,0011 |
| ? ? ? ? ?| 反码 | 0 ?000,0000,0000,0000,0000,0000,0000,0011 |
| ? ? ? ? ?| 补码 | 0 ?000,0000,0000,0000,0000,0000,0000,0011 |

负数:

原码:直接转换为其二进制

补码:符号位不变,其他位次取反

补码:反码+1

| 10进制数 | 负数 | 对应二进制数 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| -------- | ---- | ------------------------------------------------------ |
| -3 ? ? ? | 原码 | 1 ?000,0000,0000,0000,0000,0000,0000,0011 ? ? ? |
| ? ? ? ? ?| 反码 | 1 ?111,1111,1111,1111,1111,1111,1111,1111,1100 |
| ? ? ? ? ?| 补码 | 1 ?111,1111,1111,1111,1111,1111,1111,1111,1101 |

对比上面的内存图,可以发现,整形数据类型存储的是**补码**的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
#include <stdio.h>
int check_sys()
{
? ?int i = 1;
? ?return (*(char *)&i);//强制类型转换为char*,访问第一个字节即可
}
int main()
{
? ?int ret = check_sys();
? ?if(ret == 1)
? ?{
? ? ? printf("小端\n");
? ?}
? ?else
? ?{
? ? ? printf("大端\n");
? ?}
? ?return 0;?
}
```

#### 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有效位 |
| ------------ | ------- | ------- | ------- |
| float(32) ?| 1 ? ? ? | 8 ? ? ? | 23 ? ? ?|
| double(64) | 1 ? ? ? | 11 ? ? ?| 52 ? ? ?|

**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
int main()
{
? int n = 9;
? float *pFloat = (float *)&n;
? printf("n的值为:%d\n",n);//9
? printf("*pFloat的值为:%f\n",*pFloat);//0.000000
? *pFloat = 9.0;
? printf("num的值为:%d\n",n);//1091567616
? printf("*pFloat的值为:%f\n",*pFloat);//9.000000
? return 0;?
}
```

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语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 12:40:48  更:2021-10-04 12:41:07 
 
开发: 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年5日历 -2024/5/20 0:01:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码