【C语言】数据的存储

数据类型介绍

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

类型的基本分类

整型

char //由于内存中存储ASCII码值,,所以归为整型
unsigned char
signed char
short
unsigned short
signed short
int
unsigned int
signed int
long
unsigned long
signed long

浮点数

float
double

构造类型

即自定义类型
数组类型
结构体类型struct
枚举类型enum
联合类型union

指针类型

 int* pi;
 char* pc;
 float* pf;
 void* pv;

空类型

void表示空类型
通常用于函数的返回类型、函数的参数、指针类型

整型在内存中的存储

原码、反码、补码

整数的二进制表示有三种形式:原码、反码、补码
正整数:原码、反码、补码相同
负整数:原码、反码、补码需要计算
a=-10
原码10000000 00000000 00000000 00001010
反码11111111 11111111 11111111 11110101
//原码符号位不变,其它位按位取反码
补码11111111 11111111 11111111 11110110
//反码+1得到补码
调试-内存窗口-&a-内存中放的是十六进制f6 ff ff ff

说明:整数在内存中存储的是补码

原因:使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理( CPU只有加法器);此外,原码与补码相互转换,其运算过程是相同的,不需要额外的硬件电路。
如果用原码:1-1=1+(-1)
//00000000 00000000 00000000 00000001
//10000000 00000000 00000000 00000001
//10000000 00000000 00000000 00000010得到结果是-2

字节序

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

为什么会有大小端模式之分?
因为在计算机系统中,是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。
例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0×22为低字节。对于大端模式,就将Ox11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的×86结构是小端模式,而KEILC51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

代码判断当前机器字节序

//判断是大端序还是小端序
int main() {
	int a = 1;				//小端:01 00 00 00;大端:00 00 00 01
	//取第一个字节看是什么
	char* p = (char*)&a;	//int*
	if (*p == 1) {
		printf("小端\n");
	}
	else {
		printf("大端\n");
	}
	return 0;
}
int main() {
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++) {
		arr[i] = 0;
		printf("a");
	}
	return 0;
}

运行后出现死循环,打开监视窗口发现arr[10]、arr[11]、arr[12]的值都被改成0,而&i==&arr[12],所以此时i又被赋值为0,产生死循环。

i和arr是局部变量,放在栈区上,而栈区内存的使用习惯是:先使用高地址空间,再使用低地址空间
数组随着下标增长,地址是由低到高变化的
由于先定义i,所以i为更高地址,在arr溢出后,很有可能访问到i,release不会死循环,因为release会优化;如果后定义i,那么会报错:非法访问内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶雨莳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值