大小端 程序验证
来源:互联网 发布:tst代理淘宝开店规则 编辑:程序博客网 时间:2024/06/06 03:38
原理
大小端来自 Big Endian 和 Little Endian的直译,他们描述计算机是怎么来存储字节的。
由于计算机中存在着大于1个字节的数据类型,例如整型在C++中一般用4字节的空间来
表示,这就存在着这4个字节在空间上怎么按字节存放一个整数的问题。
方案有以下两种,如图1所示:
1. 大端存放情况下,对于数据0XABCD,先存放高位字节AB,再存放低位字节CD。由于
数据存放的时候是从地址编号小的地方开始存放,所以有了图中上半部分的存放情况;
2. 小端存放情况下,对于数据0XABCD,先存放低位字节CD,再存放高位字节AB,同理,
有了图中下半部分的存放情形。
这种两种存放方式与“大小端”的字面意思差的有点远,仅凭“大端”很难让我们马上想起
是哪种存放方式,时间长了容易记混淆。这里有一种比较容易理解的方式:
低位字节CD是数据的尾端,在“大端”存放方式中,尾端在高地址编号位置上,可以称为
“高尾端”;在“小端”存放方式中,尾端在低地址编号位置上,可以称为“低尾端”。
这样“大端”对应“高尾端”,说的是数据的尾端数据存放在高地址编号内存中;“小端”
对应着“低尾端”,说的是数据的尾端数据存放在低地址编号的内存中。字面意思很容易懂。
验证
每个计算机都有自己的主机字节序(就是字节“大小端”的存放方式),一般Intel的计算机
使用的是“小端”方式,Motorola的是使用“大端”方式。
下面使用C++ 程序来验证计算机的“大小端”存放方式:
思路:显示内存中整数OXABCD的存放方式。
#include<iostream>using namespace std;int main(){ int intBit = 0xABCD; const char* testBit = (char *)(&intBit); cout << hex; cout << "内存中整数intBit的内容为:"; cout << (int(testBit[0]) & 0xff) << " "; cout << (int(testBit[1]) & 0xff) << " "; cout << int(testBit[2]) << " "; cout << int(testBit[3]) << endl; return 0;}
我的运行结果:
内存中整数intBit的内容为:cd ab 0 0
说明我的计算机是“低尾端”,也就是“小端”存放的。
还有一种使用联合体的测试方法:
#include<iostream>using namespace std;union Endian{ short data; char ch[2];};int main(){ Endian end; end.data = 0xABCD; cout << hex; cout << (end.ch[0] & 0xff) << " " << (end.ch[1] & 0xff) << endl; return 0;}
以下文章可以参考:
轻松记住大端小端的含义(附对大端和小端的解释)
- 大小端 程序验证
- 验证大小端模式
- 大小端模式及其验证
- 大小端系统的验证
- 程序测试大小端
- 大小端测试程序
- 一个小程序验证getpagesize函数返回值的大小
- 用union验证大小端字节序
- 用union验证大小端字节序
- 大小端模式测试程序
- 大小端及tcp程序
- 程序的大小端模式
- 简短程序判断大小端
- 判断大小端的程序
- 系统大小端测试程序
- 验证上传文件格式、大小
- 大小端问题(程序实例)
- C语言大小端判断程序
- 基于Opencv的人脸识别
- 排序算法之冒泡排序
- 贪心的三道小题目
- SpringMVC与Struts2的区别
- 二哥OJ(二)
- 大小端 程序验证
- HDU 2091 空心三角形(格式控制)
- 全网都找不到的maven-jar-plugin怎么排除不想打包的目录文件内容
- C++ primer 第五版 第六章练习答案
- java 23种设计模式之 迭代器模式(cursor模式)GOF 23-1
- oj粉丝与分割平面
- 程序中的栈、堆、静态存储区
- 对于 红外遥控的信号处理 每一个按键都会有单独的操作【Arduino】
- 【离散数学】1.5可数集合与不可数集合