数据的存储(整型浮点型在内存中的存储,为什么会有大小端模式)

数据的存储

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

2)浮点数

float
double

3)构造类型

数组类型
结构体类型		struct
枚举类型	 		enum
联合体类型 		union

4)指针类型

char		*pchar
int			*pint
float		*pfloat
double		*double

5)空类型

void表示空类型(无类型)
通常做函数返回值类型、函数的参数、指针类型

2、整型在内存中的存储

首先,在创建变量的时候在内存中为变量开辟空间。
对于整型来说,在计算机中存储的是二进制的补码形式

原码、反码、补码的概念:
1、原码:直接将二进制按照正负数的形式翻译成二进制
2、反码:原码取反得到;
3、补码:反码+1得到。(正数的原码、反码、补码都相同)

在计算机中,数值一律用补码来表示和存储。
1、使用补码,可以将符号位和数值位统一处理;
2、加法和减法也可以统一处理(CPU只有加法器);
3、补码与原码可以相互转换,且不需要额外的硬件电路。

3、大小端字节序及判断

大端模式和小端模式

大端模式:数据的低位保存在内存的高地址中,数据的高位保存在低地址中。
小端模式:数据的低位保存内存的低地址,数据的高位保存在高地址。

为什么有大小端

在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 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处理器还可以由硬件来选择是大端模式还是小端模式。

4、浮点型在内存中的存储

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示 成下面的形式:
·(-1)^SM2*E
`(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数
·M表示有效数字,大于等于1,小于2
·2^E表示指数位

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int n = 9;
	float *pfloat = (float*)&n;
	printf("n的值为;%d\n", n);
	printf("*pfloat的值为:%f\n", *pfloat);

	*pfloat = 9.0;
	printf("n的值为:%d\n", n);
	printf("*pfloat的值:%f\n", *pfloat);
	system("pause");
	return 0;
}

在这里插入图片描述
5、练习
1、判断当前机器字节序
方法一

#include <stdio.h>
#include <stdlib.h>

int check_sys1()
{
	int i = 1;
	return (*(char*)&i);
}

int main()
{
	if (check_sys1())
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	system("pause");
	return 0;
}

方法二

#include <stdio.h>
#include <stdlib.h>

int check_sys2()
{
	union
	{
		int i;
		char c;
	}un;
	un.i = 1;
	return un.c;
}

int main()
{
	if (check_sys2())
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}

	system("pause");
	return 0;
}

2.练习

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a = %d b = %d c = %d\n", a, b, c);
	system("pause");
	return 0;
}

3、练习

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char a = -128;
	printf("%u\n", a);
	system("pause");
	return 0;
}

4、练习

#include <stdio.h>
#include <stdlib.h>

int main()
{
	//按照补码的方式进行运算,最后格式化为有符号整数
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
	system("pause");
	return 0;
}

5、练习

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char a = 128;
	printf("%u\n", a);
	system("pause");
	return 0;
}

6、练习

#include <stdio.h>
#include <stdlib.h>

int main()
{
	unsigned int i;
	for (i = 9; i > 0; i--)
	{
		printf("%u ", i);
	}
	system("pause");
	return 0;
}

7、练习

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d ", strlen(a));
	system("pause");
	return 0;
}

8、练习

#include <stdio.h>
#include <stdlib.h>

unsigned char i = 0;

int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("Hello,World!\n");
	}
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值