C语言怎么简单测试为大小端模式
作者:Slience_J
原文地址:https://blog.csdn.net/slience_j/article/details/52048267
1、什么是大小端模式?
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
2、知道大小端有何用?
首先要介绍一下字节序列,所谓的字节序列就是大于或者等于两个字节类型的数据存放在内存中的顺序(一个字节就不必谈序列!)。那么什么时候要用到我们去判断机器是大端模式还是小端模式呢?当我们在跨平台开发或者网络编程的时候就要去关心字节序列了,比如说我们用机器A和B通信,如果A和B的端序都是一样的话,中间自然就不用转换来转换去了。但是如果A和B机器的端序不一样,如果我们不去做相应的转换,我们传过去的二进制序列就是反的!
3、如何去判断你的机器是大端模式还是小端模式?
在这里我提供了简单的三个方法,如果有哪里不妥的希望大牛指出。
第一种:
#include
int main(int argc, char *argv[])
{
int i = 0x12345678;
char c = i; printf("%x \n", c); return ;
}
注:这种方式的定义一个int型的数据类型,初始化为十六进制0x12345678,在内存中存放的位置从低位到高位,依次为(低位)87654321(高位);再定义一个占一个字节的char型,然后把int型数据赋值给char型数据,因为char占一个字节,int占四个字节,这样赋值就会丢掉三个字节,但是这正是我们需要的,如果它打印出78(小端模式),如果打印出12(大端模式)。
第二种:
#include
int main(int argc, char *argv[])
{
int i = 0x12345678;
char *c = (char *)&i; printf("%x \n", *c); return ;
}
注:这种方式和上面那种方式差不多,只是运用到了指针的知识,原理都一样
第三种:
#include typedef union NODE
{
int i;
char c;
}Node; int main(int argc, char *argv[])
{
Node node; node.i = 0x12345678; printf("%x\n", node.c); return ;
}
注:这种方式运用到了union(共用体),所谓的共用体,就是共同使用一块内存,共用体的大小是共用体中的所有类型最大的哪一个,例如上面的共用体中int是四个字节,char为一个字节,那么这个共用体的大小就是四个字节。当然这个要看你的系统是多少位的(在这里我说的是32位系统,64位系统int是8个字节),先对共用体中的int型数据i赋初值,然后在用char去访问一个字节的数据,如果打印出结果为78(小端模式),反之为大端模式。
C语言怎么简单测试为大小端模式的更多相关文章
- 用C语言代码判别CPU的大小端模式
Big-endian和little-endian是描述排列存储在计算机内存里的字节序列的术语. Big-endian是一种大值的一端(序列中更典型值)存在前面(在最小的存储地址)的顺序. ...
- 经典笔试题:用C写一个函数测试当前机器大小端模式
“用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...
- CPU的大小端模式
不同体系结构的CPU,数据在内存中存放的排列顺序是不一样的. 存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:大 ...
- union关键字及大小端模式
1. union 关键字 union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在 union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有 ...
- CPU大小端模式及转换
通信协议中的数据传输.数组的存储方式.数据的强制转换等这些都会牵涉到大小端问题. CPU的大端和小端模式很多地方都会用到,但还是有许多朋友不知道,今天暂且普及一下. 一.为什么会有大小端模式之分呢? ...
- C/C++ 关于大小端模式
大端模式: 数据的高字节存在低地址 数据的低字节存在高地址 小端模式: 数据的高字节存在高地址 数据的低字节存在低地址 如图,i为int类型占4个字节,但只有1个字节的值为1,另外3个字节值为 ...
- union关键字 与大小端模式
union 关键字(主要用来压缩空间,如果一些数据不可能同一时间同时用到,可是考虑使用union) union关键字声明的变量称之为联合体变量: (1)联合体变量只配置一个足够大的空间来容纳最大长度的 ...
- [20190423]简单测试latch nowilling等待模式.txt
[20190423]简单测试latch nowilling等待模式.txt --//我对这个问题的理解就是如果参数willing=0,表示无法获取该latch,直接退出,再寻找类似的latch.--/ ...
- mips32和x86下的大小端模式判定
一.背景 1.1 mips32搭载32bit vxworks操作系统 1.2 x86搭载64bit windows10操作系统 二.大小端模式判定前的准备 2.1 先要知道各种架构上各种整型数占据的b ...
随机推荐
- hdu2461 Rectangles 线段树--扫描线
You are developing a software for painting rectangles on the screen. The software supports drawing s ...
- 10 BPMN PDF books, articles and brochures
转自:https://www.heflo.com/blog/bpm/bpmn-pdf/ If you are looking for more information about BPMN (Busi ...
- 【转载】Win10系统怎么清空剪切板?Win10系统清空剪切板的方法
以下文转载至系统之家: 网址:http://www.xitongzhijia.net/xtjc/20190319/152585.html Win10系统怎么清空剪切板?Win10系统清空剪切板的方法 ...
- VS打包项目详细解析
使用VS打包项目,其实很多简单.微软官方文档很详尽,故不再细述,只列出相关链接 1创建安装项目 如何:创建或添加部署项目 2 添加项目输出 如何:向部署项目中添加项 3添加用户界面 部署中的用户 ...
- laravel ORM 模型关联 with () 用法
关联时想对关联表数据筛选时:MySQL查询: SELECT * FROM A LEFT JOIN B ON A.B_id = B.id AND B.condition = $condition ORM ...
- C++Builder XE7 up1 简单测试
很久没用BCB了, 新装了BCBXE7up1试试了,发现有点找不到北了,好像与BCB6的一些默认设置项不一样,编译了一个空APP,提示找不到bpl 和 dll. 设置为不带包编译后,还是提示DLL找不 ...
- java -jar 执行jar包出现 java.lang.NoClassDefFoundError
我用idea工具将自己开发java程序打成一个可执行的jar包,当然用eclipse或者直接用jar命令行都无所谓,本质都是将程序归档到一个压缩包,并附带一个说明清单文件. 打jar的操作其实很简单, ...
- angular2的ngfor ngif指令嵌套
angular2的ngfor ngif指令嵌套 ng2 结构指令不能直接嵌套使用,可使用<ng-container>标签来包裹指令 示例如下: <ul> <ng-cont ...
- RedHat6.5安装单机flume1.6
版本号: RedHat6.5 JDK1.8 apache-flume-1.6.0 1.apache-flume-1.6.0-bin.tar.gz 下载 官网下载地址:http://archiv ...
- 解决openwrt中文界面异常
openwrt的luci以中文字体显示时,出现以下异常情况: 是因为该固件编译了其他的luci application,我是编译了meshwizard. 可作如下修改: scp登陆打开/usr/lib ...