C 学习之大小端
题外话:如有误,请留言通知我。
大小端,是数值在内存中的排列方式:数值的高低位与内存地址的大小 的关系。
大/小端,英文Big/Little Endian。
注意:endian,就是字节序、字节存储顺序的意思,也有尾数的意思。这里取尾数的含义刚刚好,原因如下。
先说一个前提:内存地址的前xx位通常是系统保留区,用于运行内核程序。所以用户程序就从另一端开始占用 --- 这就是为什么用户程序是从高位地址开始往低位地址伸展。(另一种可能本文不考虑)
在上面的前提下,我们已知int类型的长度是4 bytes,就是说它需要占用4 bytes的内存空间。
那么,它是如何占用的呢?
以 int i = 0x12345678; (见附注)为例说明,可以有两种方式,一种就是12 34 56 78,地址依次减小;另一种则是78 56 34 12,与前面的刚好相反。
两种方式都可以理解。但是,需要记住一点:int的地址永远是低位的(注意前提)。就是说,&i 获取的永远是低位的地址。
那么,第一种方式下,该地址应该是78所在的空间地址;同理,第二中方式下,该地址就是12所在的空间地址!
现在可以继续说尾数(endian)了,0x12345678的尾数自然就是78,该数字所在的端如果是低地址,就是小端对齐,反之,则是大端对齐!
代码验证windows下的大小端对齐方式
#include <stdio.h> //测试大小端对齐
int main(int argc, char const *argv[])
{
int a=0x12345678;
printf("%p, %x\n", &a, a);
char *p=(char *)&a;
char *p2=p;
char *p3=p; //输出大小端
for (int i = ; i < sizeof a; ++i)
{
printf("%p, %x\n", p++, *p);
} //如何反转大小端?
for (int i = ; i < sizeof(a)/; ++i)
{
char tmp=*p2;
*p2 = *(p2+sizeof(a)--*i);
*(p2+sizeof(a)--*i)=tmp;
++p2;
}
printf("after transfer : %p, %x\n", &a, a); for (int i = ; i < sizeof(a)/; ++i)
{
(*p3) ^= (*(p3+sizeof(a)--*i));
(*(p3+sizeof(a)--*i)) ^= (*p3);
(*p3) ^= (*(p3+sizeof(a)--*i));
++p3;
}
printf("after transfer again : %p, %x\n", &a, a); return ;
}
附注:
可能有的人不理解为什么要用这个数,或者说,为什么这个数可以说明问题。
这是基础的东西:
int 是 bytes, byte 是 bits, bits 刚好是一个16进制数字。 int == bytes;
byte == bits;
0x0 ~ 0xF == bits; // ( 0000 ~ 1111 )
byte == 0x00 ~ 0xFF; //( 00000000 ~ 11111111 )
int == 0x00 ~ 0xFF FF FF FF;
所以 1 byte 就是 2 个16进制数字,所以 int 就是 8 个16进制数字!
而为了区别每个byte的内容,将其设为不同的值是最佳选择!
C 学习之大小端的更多相关文章
- ARM CPU大小端
ARM CPU大小端: 大端模式:低位字节存在高地址上,高位字节存在低地址上 小端模式:高位字节存在高地址上,低位字节存在低地址上 STM32属于小端模式,简单的说,比如u32 temp=0X1234 ...
- C语言共用体、大小端、枚举
1.共用体和结构体的相同和不同 (1)相同点就是操作语法几乎相同.(2)不同点是本质上的不同.struct是多个独立元素(内存空间)打包在一起:union是一个元素(内存空间)的多种不同解析方式. # ...
- UWP学习记录1-开端
UWP学习记录1-开端 1.背景 针对不同基础的人,学习的路线自然是不同的.这篇文章记录的是我个人的学习路线,或者说笔记.我对自己的技术状态的定义是: A.有很好的windows平台编程基础: B.有 ...
- 联合体union和大小端(big-endian、little-endian)
1.联合体union的基本特性——和struct的同与不同 union,中文名“联合体.共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以 ...
- CPU的大小端模式
不同体系结构的CPU,数据在内存中存放的排列顺序是不一样的. 存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:大 ...
- C++/java之间的Socket通信大小端注意事项
在一个物联往项目中,需要java云平台与一个客户端做socket定制协议的通信:然而在第一次测试时,并没有按照预想的那样完成解析.查找资料以后是因为客户端的数据读取方式为小端模式,而java默认采用大 ...
- 从inet_pton()看大小端字节序
#include<stdio.h> #include<netinet/in.h> #include<stdlib.h> #include<string.h&g ...
- 【转】 CPU大小端
大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中:小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 为什么会有大小端模式之分呢?这是因为 ...
- linux kernel 如何处理大小端
暂时在用MPC8309,不太清楚大小端内核是什么时候给转的. 今天看了关于readl和writel具体实现的文章 今天就主要来分析下readl/writel如何实现高效的数据swap和寄存器读写.我们 ...
随机推荐
- Python 列表 reverse() 方法
描述 Python 列表 reverse() 方法对列表中的元素进行反向排序. 语法 reverse() 方法语法: L.reverse() 参数 无. 返回值 该方法没有返回值,但是会对列表的元素进 ...
- MIME类型释义--MIME类型大全--web.xml中有关<mime-mapping>配置说明
最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识 ...
- JavaScript:表单常用验证脚本(整理)
以下内容根据网上资源整理而来,主要来源是CSDN一个供下载的check.js,源码地址找不到了. 1. 检查输入字符串是否为空或者全部都是空格 /* 检查输入字符串是否为空或者全部都是空格 输入:st ...
- OpenGl学习glMatrixMode()函数理解
glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项 ...
- js replace 与replaceall实例用法详解
这篇文章介绍了js replace 与replaceall实例用法详解,有需要的朋友可以参考一下stringObj.replace(rgExp, replaceText) 参数 stringObj 必 ...
- sudo日志记录记录(rsyslog)
1,查软件 rpm -qa|egrep "sudo|rsyslog" 2,编辑sudoers echo "Defaults logfile=/var/log/sudo.l ...
- 不能将参数1从“const char []”转换为“LPCTSTR
今天在使用vs2008+MFC时候,使用editControl的replacesel(“”)发生报错.如下::不能将参数1从“const char []”转换为“LPCTSTR” 其解决方案就是, 在 ...
- Android开发日记(一)
实现点击一个图片按钮跳转到一个动作ImageViewSchoolCard = (ImageView) view.findViewById(R.id.ImageViewLostThings); Imag ...
- windows下PIP安装模块编码错误解决
原因是pip安装Python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码.解决办法是: python目录 Python27\Lib\site-packages 建一个文件site ...
- C#中的委托应该定义在哪里
专业回答 千锋教育 中国移动互联网研发培训领导品牌 2016-01-08 14:28 需求情况而定,一般定义在与类定义平级部分,且用public修饰,便于外部的调用. 若定义于类的内部,则必须通过调用 ...