简单的一段程序和内存问题。
下面是一段判断字节序的程序,判断的原理谁懂,还有return *(char *)(&a);是什么意思,能不能有谁懂的讲详细一点,谢了。
#include <iostream>
using namespace std;
int endian()
{
int a=1;
return *(char *)(&a);
}
void main()
{
if(endian()==1)
cout<<"little endian"<<endl;
else
cout<<"big endian"<<endl;
}
[解决办法]
相当于:
char* temp_pt=&a;
char temp=*temp_pt;
return temp;
[解决办法]
小端表示 从低地址到高地址 整数1,即0x00000001的内存为: 01 00 00 00
大端表示 从低地址到高地址 整数1,即0x00000001的内存为: 00 00 00 01
前者 *(char *)(&a) 为01
后者 *(char *)(&a) 为00
[解决办法]
[Quote=引用:]
小端表示 从低地址到高地址 整数1,即0x00000001的内存为: 01 00 00 00
大端表示 从低地址到高地址 整数1,即0x00000001的内存为: 00 00 00 01
楼上大端小端的定义已经解释的很清楚
1.首先你需要知道指针的步进值,是什么,如果是int*,那么指针加1,走四个字节
如果指针是char*,指针加1走一个字节,
2.你在int *所值的内存中存放一个1,就有
小端表示 从低地址到高地址 整数1,即0x00000001的内存为: 01 00 00 00
大端表示 从低地址到高地址 整数1,即0x00000001的内存为: 00 00 00 01
这两种的存放方式,
3.如何判断是那种方式,
*(char *)(&a),从左到右分析,先取int a;的地址,然后将它强转成char*,的这样可以保证将他赋值 给char*变量的时候可以保证步进值为1,然后再取强转之后的char*的值,如果是1,为小端,0为大端
[解决办法]
1楼讲的不错了!
我的话会这么说,&a表示取这个变量的地址,(char *)对(&a)进行类型转换,表示这个地址是指向char型(原来是int型),*对指针解引用,取得这个值,但是按照char解释它!(函数要求的返回类型是int,又进行了一次类型转换)
这个程序的大概原理应该是这样的(只保证思路是对的):
字节序表示一个值的低位是存在地址的地位还是高位!
int a=1;一般int是4个字节,如果写成16进制就是0x00000001,那么进行强制类型转换的时候,因为char是一个字节的,只会读取一个字节的内容!假设是little endian,被读取的应该是低字节了,0x01被读取了,在转换成int型,函数返回了整型1!如果是big endian,被读取的应该是高字节,那就是0x00,最后函数就返回0了!