栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

第4讲 - C语言关键字(4)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第4讲 - C语言关键字(4)

大端和小端存储

我们首先引入大小端的概念

int main()
{
	unsigned int a = -10;
	return 0;
}

变量a在内存中的存储形式是什么呢?

答:我们进行分析,我们首先要写出-10的补码,-10的源码是1000 0000 0000 0000 0000 0000 0000 1010 ,-10的反码是1111 1111 1111 1111 1111 1111 1111 0101 对应的补码是1111 1111 1111 1111 1111 1111 1111 0110 ,我们知道,整型在内存中的存储形式是16进位制的,所以-10的补码对应的16进位制的结果是FF FF FF F6,我们进行调试,看看a在内存中的存储

我们可以发现,整型a在内存中的存储形式是F6 FF FF FF,和我们推算的结果是相反的,原因是什么?这就涉及到大小端问题了

这里插一嘴前面学习过的内容

int main()
{
	unsigned int a = -10;
	printf("%dn", a);
	printf("%un", a);
	return 0;
}

两个问题

1:打印出来的两个结果是什么?

2:这里的存和取分别对应什么?

1:答:

 原因是什么呢?整型存储的时候是不关乎类型的,只有取的时候需要关乎类型,就想之前我们所说的,存进去的-10对应的二进位制的补码是1111 1111 1111 1111 1111 1111 1111 0110,这就叫做存,无论我们是有符号类型还是无符号类型,存储的结果都是相同的,但我们用有符号整型取时,存进去的-10,所以取出来的结果也是-10,当我们用无符号整型取时,我们进行分析,1111 1111 1111 1111 1111 1111 1111 0110,因为我们是无符号整型,所以没有源码反码补码的概念,二进位制中的首位1对应的不是符号位,计算出来的数字就是二进位制1111 1111 1111 1111 1111 1111 1111 0110对应的数字

 得出结论:存储的时候,和类型无关,当取出的时候,和类型有关

大小端字节序

大小端字节序是非常容易理解的

例如0x11 22 33 44,这里的11代表的是高权值位,44代表的是低权值位

当用小端字节序存储时,对应的结果是0x44 33 22 11,内存中,从左到右,从上到下,地址逐渐增高,44对应的地址是低地址,对应的权值也是低权值

一句话总结:小端字节序存储,低权值位数据存储在低地址处

当用大端字节序存储时,对应的结果是0x11 22 33 44 ,44对应的是高地址,44对应的权值位是低权值位

一句话总结:大端字节序存储,低权值位数据存储在高地址处

注意:无论是大小端存储,怎么存的怎么取,所以大小端存储并不会改变数据的值

大端存储是顺序,小端存储是逆序

类型的取值范围

首先,我们介绍一下signed(有符号)char

因为char类型的数据占八个比特位,第一位是符号位,所以signed char取的最小值是1 1111 111,取得最大值是0 1111 111,所以得到的结果是{-127,127},对吗? 

答:结果是不对的,因为我们char类型占八个字节,八个字节所对应的数据个数有256个,但我我们的-127到127只有255个,所以我们少算了一个,不对

为什么会出现这种情况呢?

答:当我们为对应的是正数的时候,对应的结果是0到127,对应的是负数的时候,对应的结果是0到-127,我们可以发现,0出现了两次,但是每一个二进位制所能代表的结果只有一个,所以出现错误,错误的原因是0000 0000代表的是0,而我们把1000 0000也看成了0,所以产生错误,1000 0000表示的数字只能是128,因为是负数,所以是-128,所以signed char类型的取值范围是【-128,127】

如何存储
int main()
{
	char a = -128;
	printf("%d", a);
	return 0;
}

-128对应的二进位制的结果是1 1000 0000,我们可以发现,出现了9位,是否合法呢?答案是合法的,1 1000 0000对应的反码是1 0111 1111,对应的补码是1 1000 0000,我们再进行截断,得到的结果是1000 0000,这就是char类型存储对应的过程

题目
int main()
{
	char a[1000];
	for (int i = 0; j < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%dn", strlen(a));
	return 0;
}

这道题要怎么做

答:首先,数组a是char类型的,char类型的取值范围是【-128,127】,当i=0时,数组a的第一个元素是-1,当i=127时,数组对应的元素是-128,接下来当i=128时,128对应的二进位制的补码是1000 0000,-1对应的补码是1111 1111,相加的结果是1 0111 1111,我们进行截断,得到的结果是0111 1111,对应的结果是127,所以随着i的增加,数组内部被初始化的元素是从-1到-128,再从127到0,并且0不计入元素范围,所以得到的结果是-1到-128一共128个元素,127到1一共127个元素,所以数组a的元素有255个,所以打印结果为255

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990530.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号