数据的存储

文章详细介绍了C语言中的数据类型,包括整型(如char、short、int、long及其有符号、无符号形式)、浮点型(double和float)以及构造类型(数组、结构体、枚举和联合)。针对整型,重点讲解了它们在内存中的存储方式,强调了整数以补码形式存储,并通过实例验证了这一点。此外,还提及了大小端的概念,即字节的存储顺序。
摘要由CSDN通过智能技术生成

一.数据类型

  1. 整型

char

signed char

unsigned char

字符类型在内存中存储的是他们的ASCII值 所以也可以看作是整型

对于char来说 char是有符号char还是无符号char取决于编译器的 一般情况是有符号char 相当于signed char

short

signed short

unsigned short

对于short类型来说 short就是有符号的short 和signed short一样

int <-->signed int unsigned int

long<--> signed long unsigned long

  1. 浮点型

double//双精度浮点型

float//单精度浮点型

3.构造类型

数组类型

结构体类型

枚举类型

联合类型

二.整型在内存中的存储

1.数据在内存中都是以二进制的形式存储的 整型以二进制的方式表示有三种 :原码 反码 补码

2.一般情况下整数的二进制序列是由符号位和数据位组成的 最高位为符号位 0表示正数 1表示负数

  1. 正整数的原码 反码 补码是一样的

int a = 10; 00000000000000000000000000001010 10的二进制序列 是原码 也是反码 也是补码

  1. 负整数的原码 反码 补码 是需要计算的

int a = -10; 10000000000000000000000000001010 -10的原码

11111111111111111111111111110101 -10的反码 在原码的基础上符号位不变 其他位按位取反

11111111111111111111111111110110 -10的补码 在原码的基础上+1

5.对于整数来说内存中存储的是补码

验证1:

-10的补码 1111 1111 1111 1111 1111 1111 1111 0110 我们知道4个二进制位表示一个16进制位

0x f f f f f f f 6

我们通过调试看到的内存是0xfffffff6 所以内存中存储的是补码

验证2:

计算1-1 我们知道cpu只有加法器 要计算1-1就得转化成1+(-1)

00000000000000000000000000000001 1的原码 反码 补码

10000000000000000000000000000001 -1的原码

11111111111111111111111111111110 -1的反码

11111111111111111111111111111111 -1的补码

假设内存中的是原码:

00000000000000000000000000000001 1的原码

10000000000000000000000000000001 -1的原码

//相加

10000000000000000000000000000010 原码 转化成10进制为-2

1-1的结果很明显不为-2 所以原码计算的结果是错误的

假设内存中存储的是补码:

00000000000000000000000000000001 1的补码

11111111111111111111111111111111 -1的补码

//相加

100000000000000000000000000000000 33位 此时int类型只能放32位 所以要将高位的1丢弃

00000000000000000000000000000000 这就是相加的二进制补码结果 转换成原码也一样 0

所以这个计算结果是正确的 所以整数在内存中是以补码的形式存储的

三.大小端(以字节为顺序的存储方式)

  1. 大端字节序存储:把一个数低位字节处的数据存放到高地址处,把一个数的高位字节处的数据存放到低地址处(顺着存储)

int a = 0x11223344; 11就是高位字节处的数据 44就是低位字节处的数据 2个16进制位表示一个字节

11 22 33 44

低地址-->高地址

  1. 小端字节序存储:把一个数高位字节处的数据存放到高地址处,把一个数的低位字节处的数据存放到低地址处(倒着存储)

int a = 0x11223344;

44 33 22 11

低地址-->高地址

四.拓展

讨论一下数据类型的取值范围

char类型 一个char类型能放8个bit位 把这8个二进制bit位的所有情况写出来如下:

二进制序列 转换为10进制 这些数据都是在内存中的补码 在转化10进制之前要转换成原码

00000000 0

00000001 1

00000010 2

...

01111111 127

10000000 -128

10000001 -127

...

11111110 -2

11111111 -1

所以有符号char的取值范围为-128~127 就是-2^7 ~ 2^7-1

无符号char的取值范围就是0 ~ 255 就是 0 ~ 2^8-1

通过char我们可以推出short类型的取值范围

有符号的short -2^15 ~ 2^15-1

无符号的short 0 ~ 2^16-1

int long 类型的也可以通过这个规律来计算

需要注意的是 有符号的类型反复+1的变化实际上是一个循环

举例:

有符号char类型的数据从0开始反复+1 一直加直到127的时候 在+1就变成了-128

从-128+1 一直加到-1 -1在+1就变成了0 就是这么一个循环 而不是我们日常生活中的+1会一直变大 像是一条直线 这里的类型加1更像是一个园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值