Linux 可移植性(硬件可移植)
一.64位兼容
64位到底意味了什么.通常:长整型和指针数据类新使用64位,而其他数据类型可能使用32位.
1.首先遇到的问题是不安全的类型转换
int i=(int)pointer;
如果在64位机器下,pointer是64位长度的.
因此追加了void *类型到c标准中去,由gcc支持:
void *p=pointer
这样可以安全的将一个指针存储在一些通用的类型中.
二.字节序
字节序:一种是最重要的字节优先存储,另一种是最不重要的字节优先存储
相反最低位数据放在低地址就是小头字节序
那么字节序到底会导致什么问题呢?
例子:
#include <stdio.h>
#include <stdlib.h>
static inline int little_endian()
{
int endian=1;
return (0==(*(char *)&endian));
}
void broken_endian_example()
{
union
{
int i;
char j[sizeof(int)];
}test={0xdeadbeef};
int i=0;
for(i=0;i<sizeof(int);i++)
{
printf("test.h[%d]=0x%x\n",i,test.j[i]);
}
}
int main(int argc,char **argv)
{
printf("this machine is ");
little_endian()?printf("big"):printf("little");
printf("endian\n");
printf("this program was build on a machine that is :");
#if BYTE_ORDER==BIG_ENDIAN
printf("big endian\n");
#else
#if BYTE_ORDER==LITTLE_ENDIAN
printf("little endian\n");
#else
printf("something weird\n");
#endif
#endif
printf("and here is a silly example...\n");
broken_endian_example();
exit(0);
}
this machine is little endian
this program was build on a machine that is :little endian
and here is a silly example...
test.h[0]=0xffffffef
test.h[1]=0xffffffbe
test.h[2]=0xffffffad
test.h[3]=0xffffffde