C.C语言剖析数据类型

本文围绕C语言展开,介绍了整形、浮点型等数据类型,阐述了整形在内存中的存储,包括原码、反码、补码及大小端模式,还讲解了浮点型存储规则。此外,对结构体、位段、枚举和联合体的定义、特点、内存分配等方面进行了详细说明,为C语言学习者提供了全面的知识参考。

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

文章目录

一. 数据类型介绍

1.1. 整形家族

1.2. 浮点数家族

1.3. 构造类型

1.4. 指针类型

1.5. 空类型

二. 整形在内存中的存储

2.1. 原码、反码、补码

2.2. 大小端介绍

2.2.1. 什么大端小端

2.2.2. 为什么有大端和小端

2.2.3. 百度2015年系统工程师笔试题

2.3. 数据溢出与截断问题

三. 浮点型在内存中的存储

四. 结构体

4.1. 结构的基础知识

4.2. 结构的声明

4.3. 特殊的声明

4.4. 结构的自引用

4.5. 结构体变量的定义和初始化

4.6. 结构体内存对齐

4.7. 修改默认对齐数

4.8. 结构体传参

五. 位段

5.1. 什么是位段

5.2. 位段的内存分配

5.3. 位段的跨平台问题

5.4. 位段的应用

六. 枚举

6.1. 枚举类型的定义

6.2. 枚举的优点

6.3. 枚举的使用

七. 联合体(共同体)

7.1. 联合类型的定义

7.2. 联合的特点

7.3. 联合大小的计算


一. 数据类型介绍

  • C语言中基本的内置类型:

char 			//字符数据类型.
short 			//短整型.
int 			//整形.
long 			//长整型.
long long 		//更长的整形.
float 			//单精度浮点数.
double 			//双精度浮点数.
整型表示的范围:limis.h中定义
  • 以及他们所占存储空间的大小:

#include <stdio.h>
int main() {
	printf("char size		= %u\n", sizeof(char));		 // 1.
	printf("short size		= %u\n", sizeof(short));	 // 2.
	printf("int size		= %u\n", sizeof(int));		 // 4.
	printf("long long size	= %u\n", sizeof(long long)); // 8.
	printf("float size		= %u\n", sizeof(float));	 // 4.
	printf("double size		= %u\n", sizeof(double));	 // 8.
	return 0;
}
  • 类型的意义:

    • 使用这个类型开辟内存空间的大小(大小决定了使用范围)。

    • 如何看待内存空间的视角。

1.1. 整形家族

// char
		unsigned char				// 无符号.
		signed char					// 有符号.
// short	
		unsigned short [int]		// 无符号.
		signed short [int]			// 有符号.
// int	
		unsigned int				// 无符号.
		signed int					// 有符号.
// long	
		unsigned long [int]			// 无符号.
		signed long [int]			// 有符号.
// long long	
		unsigned long long [int]	// 无符号.
		signed long long [int]		// 有符号.

1.2. 浮点数家族

float		// 单精度浮点型.
double		// 双精度浮点型.

1.3. 构造类型

int []		// 数组类型. 
struct		// 结构体类型. 	
enum		// 枚举类型. 		
union		// 联合类型. 			

1.4. 指针类型

int *pi;	// int型指针.
char *pc;	// char型指针.
float* pf;	// float型指针.
void* pv;	// 空指针.

1.5. 空类型

void 		// 表示空类型(无类型)通常应用于函数的返回类型、函数的参数、指针类型。

二. 整形在内存中的存储

  • 那接下来我们谈谈数据在所开辟内存中到底是如何存储的?

int a = 20;
int b = -10;
// 我们知道为 a 和 b 都分配四个字节的空间,那如何存储?
  • 数组在不同的表现形式

// 2进制、8进制、十进制、十六进制
// 比如:十进制的21	
// 二进制表现形式: 0b10101		0b开头代表二进制
// 八进制表现形式: 025			0开头代表八进制
// 十进制表现形式: 21
// 十六进制表现形式:0x15	    0x开头代表十六进制

2.1. 原码、反码、补码

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

  • 正数原、反、补码都相同。 

  • 负整数三种表示方法各不相同。,三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位

  • 原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。

  • 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

  • 补码:反码+1就得到补码。

// 正整数
int a = 20;
// 源码:00000000000000000000000000010100 -- 源码 相同
// 十六进制:0x00 00 00 14
// 反码:00000000000000000000000000010100 -- 反码 相同
// 十六进制:0x00 00 00 14
// 补码:00000000000000000000000000010100 -- 补码 相同
// 十六进制:0x00 00 00 14

// 负整数
int b = -10;
// 源码:10000000000000000000000000001010 -- 源码 直接通过正负的形式写二进制序列就是源码
// 十六进制:0x80 00 00 0a
// 反码:11111111111111111111111111110101 -- 反码 原码的符号位不变,其他位按位取反就是反码
// 十六进制:0xfffffff5
// 补码:11111111111111111111111111110110 -- 补码 反码+1就是补码
// 十六进制:0xfffffff6

对于整形来说:数据存放内存中其实存放的是补码。

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

我们可以看到对于a和b分别存储的是补码。但是我们发现顺序有点不对劲,为什么呢?

// 解释计算机中为何存放的是补码:1-1 = 1+(-1)
// 源码计算:
// 00000000000000000000000000000001	-- 1的源码
// 10000000000000000000000000000001 -- -1的源码
// ---------------------------------------------
// 10000000000000000000000000000010 -- -2的源码
// 1+(-1) = -2 结果是不对的.

// 补码计算:
// 00000000000000000000000000000001	-- 1的补码
// 11111111111111111111111111111111 -- -1的补码
// ---------------------------------------------
// 00000000000000000000000000000000 -- 0的补码
// 将数据转为源码
// 00000000000000000000000000000000 -- 0的补码
// 11111111111111111111111111111111 -- 取反
// 00000000000000000000000000000000 -- +1得到源码

2.2. 大小端介绍

2.2.1. 什么大端小端

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

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

2.2.2. 为什么有大端和小端

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值