C语言进阶数据的存储

Posted Huang_ZhenSheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言进阶数据的存储相关的知识,希望对你有一定的参考价值。

目录

1.整形在内存中的存储

原码 反码 补码

大小端介绍:

代码分析1:

代码分析2:

代码分析3:

代码分析4:

代码分析5:

代码分析6:

代码分析7:

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

代码分析: 


1.整形在内存中的存储

原码 反码 补码

数据在内存中以2进制的形式存储

对于整数来说:整数二进制有3种表示形式:原码,反码,补码

对于正整数:原码,反码,补码相同

负整数:原码,反码,补码

  1. 按照数据的数值写出的二进制序列就是原码
  2. 原码的符号位不变,其他位按位取反,得到的就是反码
  3. 反码+1,得到的就是补码

整数在内存中存储的是补码

大小端介绍:

大端字节序:把数据的低位字节序的内容放在高地址处,高位字节序的内容放在低地址处

小端字节序:把数据的低位字节序的内容放在低地址处,高位字节序的内容放在高地址处

例题:设计一个小程序来判断当前机器的字节序

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int check()
{
	int a = 1;
	char* p = (char*)&a;//(char*)会强行截取内存低地址处的第一位数字
	return *p;//返回1表示小端,返回0表示大端
}
int main()
{
	int ret = check();
	if (ret == 1)
		printf("小端\\n");
	else
	printf("大端\\n");
	return 0;
}

代码分析1:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char a = -1;//整数存到内存中发生截断,存8个比特位
	//10000000 00000000 00000000 00000001
	//11111111 11111111 11111111 11111110
	//11111111 11111111 11111111 11111111
	//11111111补码
	//11111111 11111111 11111111 11111111补码
	//打印的时候以%d的形式打印,打印整形,按照符号位提升
	signed char b = -1;
	//11111111
	//打印的时候以%d的形式打印,打印整形,按照符号位提升
	unsigned char c = -1;
	//11111111
	//打印的时候以%d的形式打印,打印整形
	//00000000 00000000 00000000 11111111(高位补0)补码,正数(原反补相同)

	printf("a = %d,b = %d,c = %d",a,b,c);//-1,-1,255
	return 0;
}

补充:

1.char 到底是signed char 还是unsigned char?C语言标准并没有规定,取决于编译器

2.而int 类型,short类型代表的都是有符号的

代码分析2:

下面程序输出的结果是:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char a = -128;
	//10000000 00000000 00000000 10000000
	//11111111 11111111 11111111 01111111
	//11111111 11111111 11111111 10000000
	//10000000
	//11111111 11111111 11111111 10000000
	printf("%u\\n",a);//%u的形式打印
	//11111111 11111111 11111111 01111111
	//10000000 00000000 00000000 10000000
	printf("%d\\n",a);
	return 0;
}

代码分析3:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char a = 128;
	//00000000 00000000 00000000 10000000  原反补相同
	//10000000
	//11111111 11111111 11111111 10000000
	printf("%u\\n",a);
	return 0;
}

char a里面能放得下128这么大的数吗?下面来讨论一下char类型变量的取值范围

有符号的char类型的取值范围是:-127~128

无符号的char类型的取值范围是:0 ~ 255

代码分析4:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int i = -20;
	//10000000 00000000 00000000 00010100
	//11111111 11111111 11111111 11101011
	//11111111 11111111 11111111 11101100
	unsigned int j = 10;
	if (i + j > 0)
	{
		printf("大于0\\n");
	}
	//00000000 00000000 00000000 00001010
	printf("%d\\n",i+j);
	//11111111 11111111 11111111 11101100
	//00000000 00000000 00000000 00001010
	//相加:
	//11111111 11111111 11111111 11110110  补码
	//11111111 11111111 11111111 11110101
	//10000000 00000000 00000000 00001010-->-10
	return 0;
}

i+j大于0因为有符号整型和无符号整型相加放入内存时,有符号整型会强制转化成无符号整型

代码分析5:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	unsigned int  i;
	for (i = 9; i >= 0; i++)
	{
		printf("%u\\n",i);
	}
	return 0;
}

i 作为无符号数怎么变都是大于0,--->死循环

代码分析6:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d",strlen(a));//找'\\0'
	return 0;
}

输出得---> 255

代码分析7:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
unsigned char i = 0;//取值范围0-255
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("HelloWorld\\n");
	}
	return 0;
}

输出得--->死循环

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

float,double,long double类型

浮点数"5.5"在计算机内部是如何存储的?

浮点数:5.5 ——10进制

二进制:101.1 ——>1.011*2^2 ——>(-1)^0*1.011*2^2       S = 0; M = 1.011; E = 2

代码分析: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int n = 9;
	//00000000 00000000 000000000 00001001
	float* pFloat = (float*)&n;
	printf("n的值为:%d\\n",n);
	printf("*pFloat的值为:%f\\n",*pFloat);
	//浮点数的形式
	//0    00000000     0000000 000000000 00001001
	//S       E                     M
	//M:0.0000000 000000000 00001001*2^(-126)
	*pFloat = 9.0;
	//1001.0
	//1.001*2^3
	//E = 3+127 = 130;
	//0 10000010 00100000000000000000000
	printf("num的值为:%d\\n",n);
	printf("pFloat的值为:%f\\n",*pFloat);
	return 0;
}

以上是关于C语言进阶数据的存储的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶——数据在内存中的存储

C语言进阶——数据在内存中的存储

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段

C语言进阶笔记用图文+代码让你深度理解数据在内存中的存储

超详细的c进阶教程!C语言数据存储剖析