数据的存储(上)

目录

1 数据类型

1.1数据类型分类

2 整形在内存中的存储

2.1 原码、反码、补码

3 大、小端介绍

3.1 什么大端小端:

3.2 为什么会有大小端

3.3 如何判断大小端


1 数据类型

char  字符数据类型
short短整型
int整形
long长整型
long long 更长的整形
float 单精度浮点数
double双精度浮点数

1.1数据类型分类

 整形家族:

charshortintlong
unsigned charunsigned shortunsigned intunsigned long
signed charsigned shortsigned intsigned long

注意:在任意的编译器中short、int、long类型如果没有特殊的注明,都是无符号的,即是signed。唯独char类型比较特殊,如果没有特殊的注明,是不清楚是否为有符号还是无符号的。

浮点数家族:

floatdouble

构造类型:

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

指针类型:

int* pi
char* pc
float* pf

void* pv

注意:void* 类型一般是用来临时存放地址的,如果想对其进行修改,编译器就会报错。例如想实现pv++;的操作,编译器因不知道要跳过具体的字节数,所以就无法实现想要的功能。

空类型:

void表示空类型(无类型)

一般用于函数的返回类型、函数的参数、指针类型。

2 整形在内存中的存储

一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。

2.1 原码、反码、补码

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

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

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

负整数的三种表示方法各不相同。

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

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

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

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

为什么计算机内存中是用补码进行存放的呢?

小编用一个例子来解释这个问题

int main()
{
	int a = 1;
	int b = -1;
	printf("%d", a + b);
	return 0;
}

int main()
{
	int a = 1;
	int b = -1;
	a是正数,原码反码补码相同
	//00000000000000000000000000000001
	//b是负数,原码反码补码需要相互转化
	//10000000000000000000000000000001--原码
	//11111111111111111111111111111110--反码
	//11111111111111111111111111111111--补码
	


	//假设正数负数都使用原码计算
	//00000000000000000000000000000001  --a的原码
	//10000000000000000000000000000001  --b的原码
	//10000000000000000000000000000010  相加后的结果-->  -2
	//根据我们的常识1+(-1)的结果是0,但依照上述方法计算出来的结果却是-2 

	//11111111111111111111111111111111  --b的补码
	//00000000000000000000000000000001  --a的补码
    //00000000000000000000000000000000  --相加后的结果为0

	return 0;
}

上面的这个例子很好的展示了在内存中,是用整形的补码进行运算,如果直接使用原码,就会得出错误的结果。

3 大、小端介绍

3.1 什么大端小端:

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

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

3.2 为什么会有大小端

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

3.3 如何判断大小端

int check_sys()
{
	int a = 1;//十六进制为0x00000001
	if (*(char*)&a == 1)//根据大小端的定义,只要取出内存中的第一个字节进行比较就可以进行判断
		return 1;
	else
		return 0;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

搭配下图,可以更好的理解:

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值