服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言中大小端问题实例探索解决方法

C语言中大小端问题实例探索解决方法

2023-03-02 15:53故里♡9513 C/C++

这篇文章主要介绍了C语言中大小端问题实例,总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路

一、什么是大小端

大端模式:就是高位字节数据存放在内存的低地址端,低位字节数据存放在内存的高地址端。

小端模式:就是低位字节数据存放在内存的低地址端,高位字节数据存放在内存的高地址端。

【大端】和【小端】表示多字节值的哪一端存储在该值的起始地址处;

 

二、举个例子

#include<stdio.h>
int main()
{
	int a = 1;
	return 0;
}

C语言中大小端问题实例探索解决方法

调试运行一下,打开内存监视窗口,发现定义的这个int类型的变量a(int a = 1)为4个字节,转换成bit是32位,所以电脑中存储的变量a为二进制表示00000000 00000000 00000000 00000001,vs2019中的监视此时表示的16进制,也就是0x00 00 00 01。但是看看VS2019里面所显示的是不是就有点懵了,a这个变量值是1 ,在内存中存储应该是0x 00 00 00 01,为什么编译器给出的却是0x 01 00 00 00呢?提到这个问题就要说说大小端问题了!!!!

 

三、大小端演示

按照不同模式将a保存在内存中,情况如下:

C语言中大小端问题实例探索解决方法

补充:结合高位字节,低位字节与大小端进行比较理解

当向内存中存放一个数据的时候,会从内存的高地址开始往低地址的方向放这个数据,但是放数据的时候就是按照我们人为的这种认识往里面存放吗?比如向内存中放一个数据0x11 22 33 44,计算机就是把这个数字送到内存后,这个时候内存中数据放的样式就是我们输入的这样吗?其实真正向内存存储的时候,由于内存选择了不同的两种(大端、小端)存储模式,内部真正存放的样式就跟我们想的不一样了。但是人们聪明啊,把自己认为的这种顺序规定了是从高位字节到低位字节的。即一个确定的数字,从左往右,就是从高位字节到低位字节,可以说这是一种一致认为的习惯说法。

这样区分大小端就是按照字节位与地址大小比较来确定。

 

四、解释"二"中举例的问题

那么刚刚VS2019中的问题就可以讲的通了,在VS2019中,数据往内存中存放是由高地址到低地址的,由于存储方式是小端存储模式,所以先往里放高位字节的内容,即对于0x12345678来说,从高地址往低地址存放时,放入顺序就如图a所示。然后由于操作系统在访问内存数据时是从低地址向高地址的顺序进行的,所以最后显示的存放就如图b所示

C语言中大小端问题实例探索解决方法

C语言中大小端问题实例探索解决方法

 

五、怎么判断是大端还是小端

int check_sys()
{
	int a = 1;
	return *(char*)&a;
}
int main()
{
	int ret = check_sys();
	if( ret == 1 )
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

 

六、一个题目

在小端机器中,下面代码输出的结果是:( )

A.00223344
B.0
C.11223300
D.112233

#include <stdio.h>
int main()
{
	int a = 0x11223344;
  char *pc = (char*)&a;
  *pc = 0;
  printf("%x\n", a);
  return 0;
}

解析:

假设,a变量的地址为0x64,则a变量在内存中的模型为:

0x64| 44 |

0x65| 33 |

0x66| 22 |

0x67| 11 |

char*类型的指针变量pc指向只能指向字符类型的空间,如果是非char类型的空间,必须要将该空间的地址强转为char*类型。

char *pc = (char*)&a; pc实际指向的是整形变量a的空间,即pc的内容为0x64,即44,

*pc=0,即将44位置中内容改为0,修改完成之后,a中内容为:0x11223300

因此:选择C

到此这篇关于C语言中大小端问题实例探索解决方法的文章就介绍到这了,更多相关C语言大小端内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_64836447/article/details/128983454

延伸 · 阅读

精彩推荐
  • C/C++C语言实现带头结点的链表的创建、查找、插入、删除操作

    C语言实现带头结点的链表的创建、查找、插入、删除操作

    这篇文章主要介绍了C语言实现带头结点的链表的创建、查找、插入、删除操作方法,对于了解数据结构中链表的各项操作有很好的借鉴价值,需要的朋友可以...

    C语言程序设计9642021-02-02
  • C/C++C++之boost::array的用法

    C++之boost::array的用法

    这篇文章主要介绍了C++之boost::array的用法,以实例的形式简单讲述了静态数组的容器boost::array的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下...

    C++教程网11232021-02-18
  • C/C++C++事件处理中__event与__raise关键字的用法讲解

    C++事件处理中__event与__raise关键字的用法讲解

    这篇文章主要介绍了C++事件处理中__event与__raise关键字的用法,是C++入门学习中的基础知识,需要的朋友可以参考下...

    C++教程网5682021-03-24
  • C/C++C++入门之实现十步万度游戏

    C++入门之实现十步万度游戏

    这篇文章主要介绍了C++入门实现十步万度游戏,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参...

    cqu_shuai7752022-01-19
  • C/C++OpenCV绘制正多边形的方法

    OpenCV绘制正多边形的方法

    这篇文章主要为大家详细介绍了OpenCV绘制正多边形的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    激萌小宅4032021-07-17
  • C/C++C++成员函数中const的使用详解

    C++成员函数中const的使用详解

    这篇文章主要为大家详细介绍了C++成员函数中const的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能...

    EJoft7382022-10-19
  • C/C++浅谈C++中virtual的三种用法

    浅谈C++中virtual的三种用法

    这篇文章主要介绍了浅谈C++中virtual的三种用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    yuanchunsi4572021-09-16
  • C/C++C语言中的long型究竟占4个字节还是8个字节(遇到的坑)

    C语言中的long型究竟占4个字节还是8个字节(遇到的坑)

    小编在复习C语言的时候踩到了不少坑,纠结long类型究竟占4个字节还是8个字节呢?好,今天通过本文给大家分享下我的详细思路,感兴趣的朋友跟随小编一...

    明天不吃鱼3952022-02-21