当前位置: 首页>前端>正文

C进阶-数据的存储

文章目录

  • 1. 数据类型介绍
    • 类型的基本归类
  • 2. 整型在内存中的存储:原码,反码,补码
      • 2.1. 原码,反码,补码
    • 2.2. 大小端介绍
      • 大端字节序存储
      • 小端字节序存储
      • 例:设计程序判断是大端还是小端?
    • 2.3. 练习
      • 练习1
      • 练习2
      • 练习3
      • 练习4
  • 3. 浮点型在内存中的存储

1. 数据类型介绍

数据类型数据类型字节
char字符数据类型1
short短整型2
int整型4
long长整型4/8
long long更长的整型8
float单精度浮点数4
double双精度浮点数8
  • 类型的意义:
    1.使用这个类型开辟空间的大小.(大小决定了适用范围).
    2.如何看待内存空间的视角.

类型的基本归类

整型家族:
	//字符的本质是ASCII码值,是整型,所以划分到整型家族.
	//char到底是signed char 还是unsigned char 标准是未定义的,取决于编译器的实现.
	char
		unsigned char
		signed char
	short
		unsigned short [int]
		signed short [int]
	int
		//int a; <---> signed int a;
		unsigned int
		signed int
	long
		unsigned long [int]
		signed long [int]
	long long1
		unsigned long long [int]
		signed long long [int]

浮点型家族:只要表示小数就可以使用浮点型
float 的精度低,存储的数值范围比较小,
double 的精度高,存储的数组范围比较大
构造类型: 自定义类型-可以自己创建出新的类型
	数组类型
	结构体类型 struct
	枚举类型 enum
	联合类型 union
指针类型:
	int *pi;
	char* pc;
	float* pf;
	void* pv;
空类型: 
	void
	                         
	void test(void);
	//第一个void 表示函数不会返回值
	//第二个void 表示函数不需要传任何参数

2. 整型在内存中的存储:原码,反码,补码

  • 数值的表示
    • 2进制 0b10101
    • 8进制 025
    • 10进制 21
    • 16进制 0x15

2.1. 原码,反码,补码

  • 整数的2进制也有3种表示形式:

    • 符号位+数值位,符号位为0表示"正", 为1表示"负".
    • 1.正的整数,原码,反码,补码相同
    • 2.负的整数,原码,反码,补码需要计算.
    • 原码: 直接通过正负的形式写出二进制序列就是原码
    • 反码: 原码的符号位不变,其他位按位取反
    • 补码: 反码+1
  • 整数内存中存补码的2进制

    • 为什么?
    • 使用补码,可以将符号位和数值域统一处理
    • 同时,加法和减法也可以统一处理(CPU只有加法器).
    • 补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路.
    int a = 20;
    //20
    //00000000 00000000 00000000 00010100
    //0x 00 00 00 14
    //原码,反码,补码相同
    
    //int b = -10;
    //-10
    //10000000 00000000 00000000 00001010 -- 原码
    //11111111 11111111 11111111 11110101 -- 反码
    //11111111 11111111 11111111 11110110 -- 补码
    //0x ff ff ff f6
    

在内存窗口查看20,-10的地址中存储的数据
C进阶-数据的存储,在这里插入图片描述,第1张

2.2. 大小端介绍

大端字节序存储

  • 把一个数据的高位字节序的内容存放在低地址处,
    把低字节序的内容存放在高地址处,就是大端字节序存储.

小端字节序存储

  • 把一个数据的高位字节序的内容存放在高地址处,
    把低字节序的内容存放在低地址处,就是小端字节序存储.

例:设计程序判断是大端还是小端?

```
	//*(char*)&a --> int*
	//check_sys();
	int check_sys()
	{
		int a = 1;
		return *(char*)&a;
	}

	int main()
	{
		int ret = check_sys();
		if (ret)
		{
		printf("小端\n");
		}
		else
		{
			printf("大端\n");
		}
		return 0;
	}

```

2.3. 练习

练习1

	char a = -1;	
	signed char b = -1;		
	//-1是整数
	//10000000 00000000 00000000 00000001 -- 原码
	//11111111 11111111 11111111 11111110 -- 反码
	//11111111 11111111 11111111 11111111 -- 补码
	//存到char,截断,取低地址的后8位
	//11111111
	//%d --打印有符号的整型
	//整型提升,char有符号,补符号位1
	//11111111 11111111 11111111 11111111 -- 补码
	//10000000 00000000 00000000 00000000 -- 反码
	//10000000 00000000 00000000 00000001 -- 原码
	//-1
	
	unsigned char c = -1;		
	//整数-1,截断后存unsigned char
	//11111111
	//%d打印整型
	//整型提升,数据类型为无符号整型,补0
	//00000000 00000000 00000000 11111111 -- 整数
	//255
	
	printf("%d %d %d\n",a,b,c);//-1 -1 255
	```
	
	
	
	```
	signed char :	-128~127
	补码:0~2^7,-1~-2^7
	原码:0~127,-128~-1	
	unsigned char:	0~255

	unsigned short: 	-32768~0~32767
	signed short:	0~65535
	

练习2

	char a = -128;
	printf("%u\n", a); 		//4,294,967,168
	//-128整数
	//10000000 00000000 00000000 10000000
	//11111111 11111111 11111111 01111111
	//11111111 11111111 11111111 10000000
	//放char
	//截断
	//10000000
	//整型提升
	//11111111 11111111 11111111 10000000
	//%u 打印无符号整数
	//4,294,967,168
	

练习3

	char a = 128;
	printf("%u\n", a);
	
	//128整数
	//00000000 00000000 00000000 10000000
	//截断
	//10000000
	//整型提升--看a的类型
	//11111111 11111111 11111111 10000000 
	//%u 打印无符号整数
	//4,294,967,168

练习4

		int i = -20;
		unsigned int j = 10;
		printf("%d\n",i+j);//-10
		//-20
		//10000000 00000000 00000000 00010100
		//11111111 11111111 11111111 11101011
		//11111111 11111111 11111111 11101100
		
		//10
		//00000000 00000000 00000000 00001010
		//
		
		//-20+10
		//11111111 11111111 11111111 11101100   -- -20
		//00000000 00000000 00000000 00001010	-- 10
		//11111111 11111111 11111111 11110110	-- 补码
		//10000000 00000000 00000000 00001001
		//10000000 00000000 00000000 00001010   -- -10
	

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

  • 浮点数家族:flloat, double, long double类型.
  • 浮点数存储规则:
    • 国际标准IEEE754:,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^S * M * 2^E

(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。

M表示有效数字,大于等于1,小于2。

2^E表示指数位。


https://www.xamrdz.com/web/22j1936589.html

相关文章: