C语言中大小端问题实例探索解决方法
作者:故里♡9513
一、什么是大小端
大端模式:就是高位字节数据存放在内存的低地址端,低位字节数据存放在内存的高地址端。
小端模式:就是低位字节数据存放在内存的低地址端,高位字节数据存放在内存的高地址端。
【大端】和【小端】表示多字节值的哪一端存储在该值的起始地址处;
二、举个例子
#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语言大小端内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!