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++函数指针+对象指针+this指针+指向类静态和非静态成员的指针

    C++函数指针+对象指针+this指针+指向类静态和非静态成员的指针

    这篇文章主要介绍了C++函数指针+对象指针+this指针+指向类静态和非静态成员的指针,函数指针定义和赋值的语法指其中数据类型代表指向函数的返回类型,形参表为指向函数的形参表,更多相关资料需要的朋友可以参考一下下面文章内容
    2022-03-03
  • VC实现给窗体的一个按钮添加事件的方法

    VC实现给窗体的一个按钮添加事件的方法

    这篇文章主要介绍了VC实现给窗体的一个按钮添加事件的方法,通过三个简单步骤实现窗体按钮添加事件,需要的朋友可以参考下
    2015-05-05
  • C++中对象的动态建立与释放详解及其作用介绍

    C++中对象的动态建立与释放详解及其作用介绍

    这篇文章主要介绍了C++中对象的动态建立与释放详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • c语言中unsigned修饰符的使用

    c语言中unsigned修饰符的使用

    在C语言中,unsigned是一种无符号整数修饰符,本文主要介绍了c语言中unsigned修饰符的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • C++ 模拟实现list(迭代器)实现代码

    C++ 模拟实现list(迭代器)实现代码

    这篇文章主要介绍了C++ 模拟实现list(迭代器)实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • C语言实现经典扫雷小游戏的示例代码

    C语言实现经典扫雷小游戏的示例代码

    扫雷游戏是在一个指定的二维空间里,随机布置雷,把不是雷的位置都找出来,在你点一个位置的时候它会显示它周围全部雷的个数,根据这个线索去找 ,会更容易赢。本文将用C语言实现这一经典游戏,感兴趣的可以尝试一下
    2022-11-11
  • C语言循环队列的表示与实现实例详解

    C语言循环队列的表示与实现实例详解

    这篇文章主要介绍了C语言循环队列的表示与实现,对于数据结构与算法的研究很有帮助,需要的朋友可以参考下
    2014-07-07
  • C语言字符函数与字符串函数详解

    C语言字符函数与字符串函数详解

    这篇文章主要给大家介绍了关于C语言字符/字符串的相关函数,文中通过示例代码总结的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2021-09-09
  • c++选择排序详解

    c++选择排序详解

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从无序组的数据元素中选出最小(或最大)的一个元素,存放在无序组的起始位置,无序组元素减少,有序组元素增加,直到全部待排序的数据元素排完。
    2017-05-05
  • C语言实现随机抢红包功能

    C语言实现随机抢红包功能

    这篇文章主要为大家详细介绍了C语言实现随机抢红包功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07

最新评论