大小端模式和直接向内存赋值
2014-10-19 13:18
113 查看
一、大小端模式
大端模式:数据的低位存储于内存的高位地址,数据的高位存储于内存的低位地址。
小端模式:数据的低位存储于内存的地位地址,数据的高位存储于内存的高位地址。
在32位处理器中,存储int型数据需要4个字节。数据0x12345678 大端模式和小端模式存储示意图如下。需要注意的是:无论是大端模式还是小端模式,数据0x12345678的地址都是内存中存储该数据的起始地址(即地址A)。
有的处理器系统采用了小端方式进行数据存放,如Intel的奔腾。有的处理器系统采用了大端方式进行数据存放,如IBM半导体和Freescale的PowerPC处理器。不仅对于处理器,一些外设的设计中也存在着使用大端或者小端进行数据存放的选择[1]。
下面看一道题目:写一个函数判断处理器是大端模式还是小端模式。
思考:上面的代码作如下的修改,输出的结果和上次一样么?
修改后的代码:
二、C语言中直接向内存赋值
无论处理器是大端模式还是小端模式,修改后的代码判断结果都是大端模式,原因在于第8行的赋值。“int a = 0xFF”,这种赋值方法是直接赋值给内存的。假设处理器是小端模式,由于计算机中数据的存储是以补码的方式存在的,所以p所指向的内存(一个字节)中存储的是负数的补码(0xFF最高位(第7位)是符号位)。0xFF的原码是0x81(0xFF按位取反后加1),最高位(第7位)是符号位,所以*p的值是-1,判断结果是大端模式。解决方法是把char
*p 改为unsigned char *p。代码如下。
修改char *p为unsigned char *p:
C语言直接向内存赋值,很好地体现了C语言的低极性。
参考文章:
[1] http://blog.csdn.net/dyllove98/article/details/8923298
大端模式:数据的低位存储于内存的高位地址,数据的高位存储于内存的低位地址。
小端模式:数据的低位存储于内存的地位地址,数据的高位存储于内存的高位地址。
在32位处理器中,存储int型数据需要4个字节。数据0x12345678 大端模式和小端模式存储示意图如下。需要注意的是:无论是大端模式还是小端模式,数据0x12345678的地址都是内存中存储该数据的起始地址(即地址A)。
有的处理器系统采用了小端方式进行数据存放,如Intel的奔腾。有的处理器系统采用了大端方式进行数据存放,如IBM半导体和Freescale的PowerPC处理器。不仅对于处理器,一些外设的设计中也存在着使用大端或者小端进行数据存放的选择[1]。
下面看一道题目:写一个函数判断处理器是大端模式还是小端模式。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int 6 main() 7 { 8 int a = 0x12345678; 9 char *p = ( char * )&a; 10 11 if( *p == 0x78 ){ 12 printf( "little\n" ); 13 } 14 else{ 15 printf( "big\n" ); 16 } 17 }
思考:上面的代码作如下的修改,输出的结果和上次一样么?
修改后的代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int 6 main() 7 { 8 int a = 0xFF;//修改的地方 9 char *p = ( char * )&a; 10 11 if( *p == 0xFF ){//修改的地方 12 printf( "little\n" ); 13 } 14 else{ 15 printf( "big\n" ); 16 } 17 }
二、C语言中直接向内存赋值
无论处理器是大端模式还是小端模式,修改后的代码判断结果都是大端模式,原因在于第8行的赋值。“int a = 0xFF”,这种赋值方法是直接赋值给内存的。假设处理器是小端模式,由于计算机中数据的存储是以补码的方式存在的,所以p所指向的内存(一个字节)中存储的是负数的补码(0xFF最高位(第7位)是符号位)。0xFF的原码是0x81(0xFF按位取反后加1),最高位(第7位)是符号位,所以*p的值是-1,判断结果是大端模式。解决方法是把char
*p 改为unsigned char *p。代码如下。
修改char *p为unsigned char *p:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int 6 main() 7 { 8 int a = 0xFF; 9 unsigned char *p = ( unsigned char * )&a;//修改的地方 10 11 if( *p == 0xFF ){ 12 printf( "little\n" ); 13 } 14 else{ 15 printf( "big\n" ); 16 } 17 }
C语言直接向内存赋值,很好地体现了C语言的低极性。
参考文章:
[1] http://blog.csdn.net/dyllove98/article/details/8923298
相关文章推荐
- (原创)确认大端模式或小端模式(最直接有效的方法)
- c\c++ 复习基础要点07---内存存储 大端模式、小端模式
- 大小端模式,栈的生长方向和内存的存放方向
- 设备IO控制操作 之 直接内存模式IOCTL
- 详解数据在内存中的真实存放次序:位序、字节序、大/小端模式与结构体、位域
- 【C/C++开发】内存对齐(内存中的数据对齐)、大端模式及小端模式
- 内存对齐(内存中的数据对齐)、大端模式及小端模式
- 写个程序判断内存是大端模式还是小端模式
- 汇编语言理解指针(指针就是汇编的间接寻址,其实就是一个简单方便的运算指令,计算完毕直接就赋值,不是从内存中去取值后赋值)
- 内存学习之:大端模式、小端模式 详解
- 大小端模式,栈的生长方向和内存的存放方向
- 实测数据在内存中的存放:大小端模式
- 大端模式Big Endian和小端模式Little Endian以及浮点数在内存中的存储
- 数据在内存中存储的方式:大端模式与小端模式
- Java题-直接赋值与重新创建内存
- 计算机大端模式和小端模式 内存对齐问题(sizeof)
- 数据在内存中存储的方式:大端模式与小端模式
- 计算机大端模式和小端模式 内存对齐问题(sizeof)
- 详解数据在内存中的真实存放次序:位序、字节序、大/小端模式与结构体、位域
- 内存对齐(内存中的数据对齐)、大端模式及小端模式