C语言 机器字节序、大小端的判断与修改
来源:互联网 发布:pla 算法初始化 编辑:程序博客网 时间:2024/04/26 00:51
一、机器字节序
1、int a = 1;
低地址 高地址
0x100 0x101 0x102 0x103
对于 int 型的整数1,对应的二进制数为:
0000 0000 0000 0000 0000 0000 0000 0001
高字节 低字节
2、我们定义一个整形变量a,假设其初始地址为0x100,结束地址为0x103,那么0x100对应
低地址,0x103对应高地址。而对于二进制数据,最前面为高字节,最后面为低字节,但
低地址存放高字节还是低字节呢?各个机器可能不同。
3、低地址存放高字节为大端;低地址存放地字节为小端;
二、那么该如何判断机器的字节序呢?
我们可以使用联合体,因为联合体的成员共用一段内存。
代码如下:
#include <stdio.h>union test{ short val; char array[sizeof(short)];};int main(){ union test t; t.val = 0x0102; if (t.array[0] == 2 && t.array[1] == 1){ printf("Little Endian\n");}else if (t.array[0] == 1 && t.array[1] == 2){ printf("Big Endian\n");}else{ printf("Unkown\n");}return 0;}
三、那么如何实现大小端的转换呢?1、使用位运算 2、移位
那么该如何移位呢?
定义一个unsigned int a;
假设a的二进制位:1011 1100 0001 1100 1110 0011 0011 0001
a & 0x0000 00ff << 24 0011 0001 0000 0000 0000 0000 0000 0000
a & 0x0000 ff00 << 8 0000 0000 1110 0011 0000 0000 0000 0000
a & 0x00ff 0000 >>8 0000 0000 0000 0000 0001 1100 0000 0000
a & 0xff00 0000 >>24 0000 0000 0000 0000 0000 0000 1011 1100
代码实例:
#include <stdio.h>int mian(){ unsigned int a = 1; unsigned int b; b = (((a & 0x000000ff) << 24) | ((a & 0x0000ff00) << 8) | ((a & 0x00ff0000) >> 8) | ((a & 0xff000000) >>24)); printf("%d\n",b); return 0;}
- C语言 机器字节序、大小端的判断与修改
- 菜鸟学习历程【10】机器字节序、大小端的判断与修改
- 【C语言】判断机器的大小端
- C语言测试机器大小端字节序
- 如何简单的判断机器的大小端字节序
- 判断机器大小字节序
- C语言,判断机器大小端
- c语言判断机器大小端
- 如何用C语言判断机器的大小端模式
- 杂项-机器字节顺序大小端判断
- C语言小程序判断机器大小端存储
- 大小端字节序的判断
- 大小端字节序的判断
- 大小端字节序的判断
- C语言:机器的大小端
- 什么是大端字节序?什么是小端字节序?如何用共用体判断机器的大小端?
- 【C语言】编写函数判断当前的机器大小端模式
- C语言判断机器CPU大小端模式的两种方法
- Ocelot——初识基于.Net Core的API网关
- JFinal+Quartz动态任务调度控制台
- 图像处理之特征提取:HOG特征简单梳理
- Hangfire在ASP.NET CORE中的简单实现
- HAVING&WHERE
- C语言 机器字节序、大小端的判断与修改
- idea Commit Changes Dialog local changes refresh
- 链队的一些操作
- C++构造函数与析构函数(一)
- 吴恩达深度学习课程deeplearning.ai课程作业:Class 2 Week 1 3.Gradient Checking
- 基于神经网络的实体识别和关系抽取联合学习 | PaperWeekly #54
- 基于Java的卡诺图化简
- SQL:DML&DDL
- 解决SwipeRefreshLayout下拉刷新与SwipeMenuListView的冲突