网站上如何设置行间距,网站信息抽查评估 短信,深圳网站seo优化,傻瓜式网站开发工具目录
1. 大小端字节序
1.1 什么是大小端字节序#xff1f;
1.2 为什么有大小端字节序?
1.3 习题#xff1a;用程序结果判断大端小端
2. 各种易混淆的高低地址顺序
2.1 监视窗口的地址表示【计算机标准展示方式】
2.2 横向地址表示
2.3 一个字节 与 多个字节 的地址…目录
1. 大小端字节序
1.1 什么是大小端字节序
1.2 为什么有大小端字节序?
1.3 习题用程序结果判断大端小端
2. 各种易混淆的高低地址顺序
2.1 监视窗口的地址表示【计算机标准展示方式】
2.2 横向地址表示
2.3 一个字节 与 多个字节 的地址顺序区别
2.4 内存空间的开辟顺序
3. 判断练习 1. 大小端字节序
1.1 什么是大小端字节序 其实超过⼀个字节的数据在内存中存储的时候就有存储顺序的问题。按照不同的存储顺序我们分为大端字节序存储和小端字节序存储下面是具体的概念 大小端描述的对象是低位字节⼤端存储模式是指数据的低位字节内容保存在内存的高地址处⽽数据的高位字节内容保存在内存的低地址处。低位数——高地址小端存储模式是指数据的低位字节内容保存在内存的低地址处⽽数据的⾼位字节内容保存在内存的⾼地址处。低位数——低地址 假设现在有一个int型大小的16进制数0x11223344它在小端序和大端序是下面这样的 Visual Studio 2022采用的是小端字节序存储。 代码演示
int main()
{int a 0x11223344; return 0;
} 1.2 为什么有大小端字节序?
这是因为在计算机系统中我们是以字节为单位的每个地址单元都对应着⼀个字节⼀个字节为8 bit 位但是在C语⾔中除了8 bit 的 char 之外还有16 bit 的 short 型32 bit 的 long 型要看 具体的编译器另外对于位数⼤于8位的处理器例如16位或者32位的处理器由于寄存器宽度⼤ 于⼀个字节那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了⼤端存储模式和小端存储模式。
例如⼀个 16bit 的 short 型 x 在内存中的地址为 0x0010 x 的值为 0x1122 那么 0x11 为⾼字节 0x22 为低字节。对于⼤端模式就将 0x11 放在低地址中即 0x0010 中 0x22 放在⾼地址中即 0x0011 中。⼩端模式刚好相反。我们常⽤的 X86 结构是⼩端模式⽽ KEIL C51 则为⼤端模式。很多的ARMDSP都为⼩端模式。有些ARM处理器还可以由硬件来选择是 ⼤端模式还是⼩端模式。 1.3 习题用程序结果判断大端小端
请简述⼤端字节序和⼩端字节序的概念设计⼀个小程序来判断当前机器的字节序。--- 百度笔试题 分析 假如我们有一个int型的十进制数1如果是小端字节序它的16进制排列是01 00 00 00如果是大端字节序它的16进制排列是00 00 00 01。指针接收变量的地址是该变量最低地址。指针的类型决定指针访问的步长。 知道了这几个知识我们就可以写成这个程序
int check_sys()
{int i 1;return (*(char*)i);
}int main()
{int ret check_sys();if (ret 1)printf(小端\n);elseprintf(大端\n);return 0;
}
在VS下输出是小端 char*指针只能访问一个字节如果是小端字节序读到的是数据01即十进制的1如果是大端字节序读到的数据是00即十进制的0。 2. 各种易混淆的高低地址顺序
2.1 监视窗口的地址表示【计算机标准展示方式】 监视窗口的数据都是16进制的数字常用“列4”的表示方式。 监视窗口的地址顺序 (1)横轴从左往右看地址变低。(左低右高) (2)纵轴从上往下看地址变高。(上低下高) 代码演示(十进制的5 等于 十六进制的00 00 00 05)
int main()
{int a 5;return 0;
}
列为4时的监视窗口展示顺序(int是4个字节所以“列4”是最常用的展示方式) 列为1时的监视窗口展示顺序 图示 2.2 横向地址表示 因为监视窗口的标准展示顺序既有横向的地址变化又有竖向的地址变化太过复杂。 为了方便自己的理解我们常采用横向的地址顺序。 (横向地址顺序不是第一次出现了在我们学习数组的时候就已经接触过只是当时用的数据是十进制的数据没有大小端字节序的概念) 比如刚刚的int a5用横向的地址表示是下面这样 图示 2.3 一个字节 与 多个字节 的地址顺序区别 一个字节中无地址顺序【无高低地址之分的数字位数顺序】 在数学上没有高低地址的说法只是在物理的内存结构中有高低地址之分。而最小的内存单元的大小是一个字节对于一个最小单元来说本质是8个二进制数字显示的是2个16进制数字。而一个数字是不会分高低地址的只有高位数与低位数之分即数字位数顺序。而数字位数顺序是固定的从左向右 位序依次降低。比如十进制从左往右千位-百位-十位-个位…… 多个字节中有地址顺序而且在VS2022中采用的是小端字节序的地址排序。 低位字节在低地址。低位的2个16进制数放在低地址。 例如我们有1个int型的数据int a 0x12345678(十六进制数)
它的内存图示是如下 监视窗口也是这样 2.4 内存空间的开辟顺序 对于前后创建的多个变量或数组 在debugx86环境下 栈区内存的使⽤习惯是从⾼地址向低地址使⽤的。【按代码顺序先在高地址创建变量(或数组)再向低地址创建变量(或数组)】 在release环境 或 x64环境下 栈区内存的使⽤习惯是从低地址向高地址使⽤的。【按代码顺序先在低地址创建变量(或数组)再向高地址创建变量(或数组)】 具体的例子可以看我这篇博客https://blog.csdn.net/2301_80030290/article/details/141333314?spm1001.2014.3001.5502#t16 对于创建的同一个数组 arr[0]是最低的地址首地址元素越靠后地址越高。 3. 判断练习
请判断下面的代码运行后的结果环境VS2022 ,debug, X86
int main() //大小端的
{int arr[4] { 1, 2, 3, 4 };int* ptr1 (int*)(arr 1);int* ptr2 (int*)((int)arr 1);printf(%x\n%x, ptr1[-1], *ptr2);return 0;
}
运行结果 画图解析 指针ptr1和ptr2都是整型指针每次可访问4个字节。
这里ptr1[-1]访问的4个字节是04 00 00 00。按小端字节序读取后的结果是16进制的0x00000004也就是4。
这里ptr2访问的4个字节是00 00 00 02。按小端字节序读取后的结果是16进制的0x02000000也就是2000000 本期分享完毕感谢大家的支持~Thanks♪(ω)