关于x86系统中“大小端”在C++中的应用实例分析
2013-05-01 02:12
405 查看
本文主要是关于一个由“大小端”引发的问题的具体分析。
笔者在百度知道看到一个提问,内容如下:
下面是由这个问题,而引发的笔者的思考:
首先,这个问题很明显是关于“大小端”的问题,即“BigEndian” 和 “SmallEndian”。
关于大小端的问题,在笔者转载的另一篇文章中,已经有较详细的解说(/article/2314020.html)。
但是,把“大小端”的问题具体化到这个百度知道的问题上,主要有2点总结要说:
一是,所谓的“小端Little-Endian”,就是“低地址存放最低有效位(LSB),既低位字节排放在内存的低地址端,高位字节排放在内存的高地址端”。同理,“大端”的解释反之;
二是,Intel X86平台采用Little Endian,而PowerPC处理器则采用了Big Endian。
如果明白了上面两点总结,那么这个问题就迎刃而解了。
首先可以确定的是,百度知道上这个问题的提问者用的十有八九是x86的计算机(否则,如果提问者用的是诸如PowerPC等的大端模式的计算机,那么那个字符串或称字符数组就没有具体的英文意义了)。
其次,回上程序上来看,程序中有一个联合体Union,该联合体中的word数组和ksi数组的指针指向同一段内存空间,即共享同一段存储空间。
把两个数组分别展开,如下所示:
----------------------------------------------------------------------------------------------------------------------------------------------------
MemoryAddress: Low --> High
----------------------------------------------------------------------------------------------------------------------------------------------------
ksi[x]: 0 1 2 3 4
(Value) 0x4f43 0x504d 0x5455 0x5245 0x0021
----------------------------------------------------------------------------------------------------------------------------------------------------
word[y]: 0 1 2 3 4 5 6 7 8
(Value) 0x43 0x4f 0x4d 0x50 0x55 0x54 0x45 0x52 0x21
----------------------------------------------------------------------------------------------------------------------------------------------------
ASCII: C O M P U T E R !
----------------------------------------------------------------------------------------------------------------------------------------------------
由上表可知,最终程序打印出来的字符串是“COMPUTER!”,而非提问者所说的“moring?"。所以说,做学问应该要有严谨的科学方法,经过严谨推论得出的结论,是不因为他人的其它说法而动摇的而且是符合真理和科学的结论。
回到问题的解答上,其中word数组与ksi数组共享同一段存储空间,以ksi[0]为例,它所指向的存储空间中有2个字节的容量,这2个字节的空间中,即存储着word[0]的值,同进度也存储着word[0]和word[1]的值,然后从前面已知x86系统中是“小端模式存储方式”,那么ksi[0]中低字节的一半值0x43就应该存储在相对低地址的空间中,恰巧这个相对低地址的空间也被word[0]共享;而高字节的一半值0x4f就应该存储在相对高地址的空间中,这个相对高地址的空间也被word[1]共享。同理可得这两个数组中其它地址中相对应的值,最终经常在x86系统中运行验证,的确打印出来的信息就是字符串“COMPUTER!
"。
笔者在百度知道看到一个提问,内容如下:
为什么此函数输出 moring? s=&x是为什么呢?
引用自:http://zhidao.baidu.com/question/545637515.html?fr=uc_push&push=&group=1
#include <iostream>
using namespace std;
int main(){
union{
char word[8];
short int ksi[5];
}x,*s;
s=&x;
s->ksi[0]=0x4f43;
s->ksi[1]=0x504d;
s->ksi[2]=0x5455;
s->ksi[3]=0x5245;
s->ksi[4]=0x0021;
cout<<s->word<<endl;
return 0;
}
下面是由这个问题,而引发的笔者的思考:首先,这个问题很明显是关于“大小端”的问题,即“BigEndian” 和 “SmallEndian”。
关于大小端的问题,在笔者转载的另一篇文章中,已经有较详细的解说(/article/2314020.html)。
但是,把“大小端”的问题具体化到这个百度知道的问题上,主要有2点总结要说:
一是,所谓的“小端Little-Endian”,就是“低地址存放最低有效位(LSB),既低位字节排放在内存的低地址端,高位字节排放在内存的高地址端”。同理,“大端”的解释反之;
二是,Intel X86平台采用Little Endian,而PowerPC处理器则采用了Big Endian。
如果明白了上面两点总结,那么这个问题就迎刃而解了。
首先可以确定的是,百度知道上这个问题的提问者用的十有八九是x86的计算机(否则,如果提问者用的是诸如PowerPC等的大端模式的计算机,那么那个字符串或称字符数组就没有具体的英文意义了)。
其次,回上程序上来看,程序中有一个联合体Union,该联合体中的word数组和ksi数组的指针指向同一段内存空间,即共享同一段存储空间。
把两个数组分别展开,如下所示:
----------------------------------------------------------------------------------------------------------------------------------------------------
MemoryAddress: Low --> High
----------------------------------------------------------------------------------------------------------------------------------------------------
ksi[x]: 0 1 2 3 4
(Value) 0x4f43 0x504d 0x5455 0x5245 0x0021
----------------------------------------------------------------------------------------------------------------------------------------------------
word[y]: 0 1 2 3 4 5 6 7 8
(Value) 0x43 0x4f 0x4d 0x50 0x55 0x54 0x45 0x52 0x21
----------------------------------------------------------------------------------------------------------------------------------------------------
ASCII: C O M P U T E R !
----------------------------------------------------------------------------------------------------------------------------------------------------
由上表可知,最终程序打印出来的字符串是“COMPUTER!”,而非提问者所说的“moring?"。所以说,做学问应该要有严谨的科学方法,经过严谨推论得出的结论,是不因为他人的其它说法而动摇的而且是符合真理和科学的结论。
回到问题的解答上,其中word数组与ksi数组共享同一段存储空间,以ksi[0]为例,它所指向的存储空间中有2个字节的容量,这2个字节的空间中,即存储着word[0]的值,同进度也存储着word[0]和word[1]的值,然后从前面已知x86系统中是“小端模式存储方式”,那么ksi[0]中低字节的一半值0x43就应该存储在相对低地址的空间中,恰巧这个相对低地址的空间也被word[0]共享;而高字节的一半值0x4f就应该存储在相对高地址的空间中,这个相对高地址的空间也被word[1]共享。同理可得这两个数组中其它地址中相对应的值,最终经常在x86系统中运行验证,的确打印出来的信息就是字符串“COMPUTER!
"。
相关文章推荐
- 关于x86系统中“大小端”在C++中的应用实例分析
- C++中引用(&)的用法与应用实例分析
- SQL语句练习实例之五 WMS系统中的关于LIFO或FIFO的问题分析
- 关于c++有界数组模版的分析与应用
- SQL语句练习实例之五 WMS系统中的关于LIFO或FIFO的问题分析
- 关于Linux系统指令 top 之 %si 占用高,分析实例一
- 医疗健康大数据: 应用实例与系统分析(转)
- C++设计实例-----毕业生收入预测分析系统
- iPhone企业应用实例分析之一:系统介绍和需求及主要用例
- 关于C++中static_cast和reinterpret_cast的区别 以及实例应用
- iPhone企业应用实例分析之一:系统介绍和需求及主要用例
- 医疗健康大数据: 应用实例与系统分析(转)
- WEB应用 信息管理系统 数据分析展示系统 OA办公工作流 快速构建与开发平台
- C++ cin,_cin.get,cin.getline等函数深入分析+实例详解
- lua和c/c++互相调用实例分析
- 全球最低功耗蓝牙单芯片(DA14580)系统架构和应用开发框架分析
- C/C++如何获取当前系统时间的实例详解
- linux系统下,c++程序,调用system命令失败,分析过程
- 关于php-fpm占用系统资源分析
- C++中引用(&)的用法和应用实例