6、C语言的数据类型与数据存储

本文围绕C语言展开,介绍了基本数据类型,包括整型和浮点型,阐述了整型的概念、修饰符、编码形式等,还说明了整型在数据中的存储,如补码存储、大端小端模式。同时详细讲解了浮点型在数据中的存储步骤,包括整数位和小数位转二进制等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基本数据类型:

1. 整型

概念:

表达整数类型的数据

语法:

int a = 123; // 定义了一个专门用来存储整数的变量a

需要注意的地方:

    1. int 的本意是 integer,即整数的意思
    2. int a 代表在内存中开辟一块小区域,称为 a,用来存放整数,a 一般被称为变量。
    3. 变量 a 所占内存大小,在不同的系统中是不一样的,64位系统典型的大小是4个字节。
    4. 变量 a 有固定的大小,因此也有取值范围,典型的范围是:-2147483648到2147483647

整型修饰符

    1. short:用来缩短整型变量的尺寸,减少取值范围并节省内存,称为短整型
    2. long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长整型
    3. long long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长长整型
    4. unsigned:用来去除整型变量的符号位,使得整型变量只能表达非负整数
short int a; // 短整型
long int b;  // 长整型
long long int c; // 长长整型
unsigned int e;  // 无符号整型
unsigned short int f; // 无符号短整型
unsigned long int g;  // 无符号长整型
unsigned long long int h; // 无符号长长整型

使用整型修饰符后,关键字 int 可以被省略:

short a; // 短整型
long b;  // 长整型
long long c; // 长长整型
unsigned e;  // 无符号整型
unsigned short f; // 无符号短整型
unsigned long g;  // 无符号长整型
unsigned long long h; // 无符号长长整型

符号位:

    1. 有符号的整型数据,首位为符号位,0表示正数,1表示负数。
    2. 无符号的整形数据,没有符号位。

编码形式:

    1. 原码:正数直接使用二进制来表达,比如a=100,在内存中是 00…001100100
    2. 补码:负数用绝对值取反加一来表达,比如a=-3,在内存中是11…1111111101
    3. 注意负数的补码在取反加一的时候,符号位是不动的

溢出:超过数据所能表达的范围,称为溢出,就像汽车里程表,最大值和最小值是相邻的

进制:源码中可以使用八进制、十进制或十六进制,但实际数据在内存中一律是二进制

    1. 十进制(默认),比如1099
    2. 八进制,比如013
    3. 十六进制,比如0x6FF0A

格式控制符

    1. int 整型:%d
    2. short 整型:%hd, h代表half,即一半的存储字节
    3. long 整型:%ld
    4. long long 整型:%lld
    5. 显示不同进制的前缀: %#o、 %#x

2. 浮点型

概念:用来表达实数的数据类型

分类:

    1. 单精度浮点型(float),典型尺寸是4字节
    2. 双精度浮点型(double),典型尺寸是8字节
    3. 长双精度浮点型(long double),典型尺寸是16字节
    4. 占用内存越多,能表达的精度越高
float f1; // 单精度
double f2; // 双精度
long double f3; // 长双精度

浮点类型

最小精度

最大数值

float

10^{-37}10−37

10^{38}1038

double

10^{-307}10−307

10^{308}10308

long double

10^{-4931}10−4931

10^{4932}104932

二、整形在数据中的存储

1、前导

1、类型表示了各种数据形式

2、类型规定了数据所占内存空间的大小

3、类型规定了数据内存存储的模型

常量:

变量:命名规则:数字、字母、下划线组成,并且首字符不能为数字

常变量:const

类型

char

short

int

long

float

double

16位系统

1

2

2

4

8

32位系统

1

2

4

4

4

8

64位系统

1

2

4

8

4

8

内存:

物理内存(PM)效率低---MMAP------>虚拟内存(VM,一般大小为4个G)

形象化:

内存:类比教室 通常大小为4G

内存单元:类比为一间教室,一个内存单元的大小是1byte=8bits

内存块:类比为几间门牌号连续的教室

内存地址:类比为教室的门牌号,通常内存地址使用十六进制表示(0x00000000~0xFFFFFFFF)

内存值:类比为教室里边的内容(内存值也可以是地址)

寻址:

根据地址找内存空间

2、数据如何存储

首先我们知道,变量再创建的时候,会向内存申请一片连续的空间,空间的大小由这个数据的类型来确定,就比如char类型会申请1个字节的空间int类型会申请4个字节的空间,那么字节是什么?字节可以理解为内存的长度,1个字节又是8个比特位,那么比特位是什么我们将会进行详细的介绍!
例如:

int a = 10;
int b = -10;

这两个变量在内存中是如何进行存储的呢?
首先我们确实类型,是int型,那么变量a和b会向内存申请4个字节的空间来存放10和-10两个数字,那么10和-10再内存中是什么样子呢?

0000 0000 0000 0000 0000 0000 0000 1010    //10
1111 1111 1111 1111 1111 1111 1111 0110    //-10

上面提到,1 个字节是 8 个比特位,4 个字节就是 32 个比特位,上面的代码就就可以显示出来,那么每一个 0 或 1 就是一个比特位,整型数据在内存中我们是以二进制码来进行存储的,那么-10 和 10 的区别很大!那是因为数据在内存中的存储,是以补码的形式进行存储的,这里就要引入一个概念,二进制码有原码,反码和补码。那么为什么10就是原来的形式呢,在二进制这三个码中,正数的原码,反码,补码都相同,但是负数就不一样了。

int a = 10;
// 原码:00000000000000000000000000001010
// 反码:00000000000000000000000000001010
// 补码:00000000000000000000000000001010

int b = -10;
// 原码:10000000000000000000000000001010
// 反码:11111111111111111111111111110101
// 补码:11111111111111111111111111110110

计算机中的整数有三种表示方法,即原码、反码、补码

原码:直接将十进制按照正负数的形式翻译成二进制就可以

反码:将原码的符号位不变,其他位取反即可得到

补码:反码 + 1

对于整型来说,数据在内存中是以补码的形式存放的。

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统
一处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程
是相同的,不需要额外的硬件电路。

3、大端,小端的介绍

    1. 大端模式存储:
      是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。
    2. 小端模式存储:
      是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

4、为什么有大端和小端:

因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器)。

另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

三、浮点型在数据中存储

float num = 13.625;

1、将整数位转换为二进制

13 -->1101

2、将小数位转换为二进制

0.625 --> 101 (乘2取整,从前往后取)

3、转换为指数形式 --> 移动小数位,保证整数位仅有一位,且必须为1

1101.101 --> 1.101101 * e3

4、按照浮点数的内存模型进行存储

符号位(占1个bit位):正数为0,负数为1

指数位(占8个bit位):127+小数点移动的位数 - -> 127 +3 -- >10000010

尾数位(占23个bit位):二进制小数位,如果不足23位,则右侧补0;如果超过23位,则截取前23位。 10110100000000000000000

5、01000001010110100000000000000000 --> 41 5A 00 00

6、将当前的数据按照小端模式进行存储

41 5A 00 00 ---小端模式----->00 00 5A 41

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值