【程序员修炼之路】——4.大小端字节序判断(百度笔试题)

【前言】今天是刷题打卡的第四天,我是Catzzz666,一个一心让大家变强的博主。废话不说,让我们进入今天的正题。

【程序员修炼之路】——4.大小端字节序判断(百度笔试题)_第1张图片

大小端的引入:

我们先来看这样一段代码:

【程序员修炼之路】——4.大小端字节序判断(百度笔试题)_第2张图片

在内存中我们创建了局部变量a,那么a在内存中又是如何存储的呢?

这时就需要理解大小端字节序存储的概念了。 

大端字节序存储:数据的低位数据存储在高地址处,高位数据存储在低地址处。

小端字节序存储:数据的低位数据存储在低地址处,高位数据存储在高地址处。

这里有很多小伙伴会问了,我们知道低地址和高地址,那么什么是低地址数据,什么又是高地址数据呢?

这里我们通过一个例子来更好的理解。

就像在十进制中个位、十位、百位、千位等等一样,从个位->十位->百位...就是从高位到低位。

【程序员修炼之路】——4.大小端字节序判断(百度笔试题)_第3张图片

 了解了什么是大小端字节序存储,我们先来看这样一个存储方式,判断a在内存中是大端字节序存储还是小端字节序存储。

 在VS2019中,从左到右,字节是不断增大的:

【程序员修炼之路】——4.大小端字节序判断(百度笔试题)_第4张图片

这里可以看出a的低位数据44存储在了低地址处,所以这其实是一个小端字节序存储。

【程序员修炼之路】——4.大小端字节序判断(百度笔试题)_第5张图片

了解了什么是大小端字节序存储,我们来看百度的这道笔试题:

 百度2015年系统工程师笔试题(10分):

        请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。

 关于大小端字节序的概念,在前面我们已经介绍过了,接下来我们来设计程序。

思考:可以通过创建一个局部变量,并且赋值为1,那么以十六进制展示的话就是0x00000001;

如果当前机器是端字节序存储的话存储的就是01000000

如果当前机器是小端字节序存储的话存储的就是00000001

【程序员修炼之路】——4.大小端字节序判断(百度笔试题)_第6张图片

 接下来就是找到字节的地址(使用指针),将a的地址找出强制转化为char*,然后进行解引用操作找到存储的数据,如果取出的内容是0,那么该机器的存储方式为大端,否则为小端。

代码实现:

//代码一
#include 

int main()
{
	int a = 1;

	char* p = (char*)&a;  //将a的地址强制转化为char*并存储在p中
	if (*p == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

         这种代码主要是便于我们理解,在面试的时候一般我们都是通过函数的形式来进行判断、进行提交,所以现在需要对代码一进行改善:(使用函数)

#include 

int judge()
{
	int a = 1;
	return *(char*)&a;//函数的返回值
}

int main()
{
	//使用ret来接收函数的返回值
	int ret = judge();
	return 0;
}

【结语】今天是刷题打卡的第四天,之前由于一些个人的原因,导致一段时间没有坚持刷题,现在生活回归正轨。

坚持刷题,一起加油,为了我们的好offer而不断努力!博主在主页设置了【程序员修炼之路】的专栏,喜欢的铁子们可以点个订阅,专栏内容会不断更新。

【程序员修炼之路】——4.大小端字节序判断(百度笔试题)_第7张图片

你可能感兴趣的:(笔试题目专栏,算法,开发语言,c语言,数据结构)