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

 更新时间:2023年02月14日 10:33:23   作者:故里♡9513  
这篇文章主要介绍了C语言中大小端问题实例,总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路

一、什么是大小端

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

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

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

二、举个例子

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

调试运行一下,打开内存监视窗口,发现定义的这个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保存在内存中,情况如下:

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

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

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

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

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

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

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语言大小端内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ Qt开发之使用QNetworkAccessManager实现Web网页访问

    C++ Qt开发之使用QNetworkAccessManager实现Web网页访问

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,本文主要介绍了如何运用QNetworkAccessManager组件实现Web网页访问,需要的可以参考下
    2024-03-03
  • C++ std::array实现编译器排序

    C++ std::array实现编译器排序

    这篇文章主要介绍了C++ std::array实现编译器排序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • C++实现对RGB图片进行编码的示例代码

    C++实现对RGB图片进行编码的示例代码

    这篇文章主要为大家详细介绍了如何利用得到的RGB信息重新对RGB图片进行编码,以及对其他图片如BMP所得到的RGB信息进行编码从而得到*.jpg文件,感兴趣的可以了解一下
    2023-05-05
  • C++调用C函数实例详解

    C++调用C函数实例详解

    这篇文章主要介绍了C++调用C函数实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 利用c语言实现卷积码编码器示例

    利用c语言实现卷积码编码器示例

    这篇文章主要介绍了利用c语言实现卷积码编码器示例,需要的朋友可以参考下
    2014-03-03
  • C++实现图书管理系统课程设计

    C++实现图书管理系统课程设计

    这篇文章主要为大家详细介绍了C++实现图书管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言详解热门考点结构体内存对齐

    C语言详解热门考点结构体内存对齐

    C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许你存储不同类型的数据项,本篇让我们来了解C 的结构体内存对齐
    2022-04-04
  • C语言魔塔游戏的实现代码

    C语言魔塔游戏的实现代码

    这篇文章主要介绍了C语言魔塔游戏的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C++的最短路径的弗洛伊德算法案例讲解

    C++的最短路径的弗洛伊德算法案例讲解

    这篇文章主要介绍了C++的最短路径的弗洛伊德算法案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • c++实现strcat字符串连接库函数的方法详解

    c++实现strcat字符串连接库函数的方法详解

    本篇文章是对使用c++实现strcat字符串连接库函数的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论