一.64位兼容
64位到底意味了什麼.通常:長整型和指針數據類新使用64位,而其他數據類型可能使用32位.
1.首先遇到的問題是不安全的類型轉換
int i=(int)pointer;
如果在64位機器下,pointer是64位長度的.
因此追加了void *類型到c標准中去,由gcc支持:
void *p=pointer
這樣可以安全的將一個指針存儲在一些通用的類型中.
二.字節序
字節序:一種是最重要的字節優先存儲,另一種是最不重要的字節優先存儲
數據按內存地址的升序一次存儲,高位數據在低地址,www.linuxidc.com就是大頭字節序
相反最低位數據放在低地址就是小頭字節序
那麼字節序到底會導致什麼問題呢?
例子:
#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
X86體系用小端字節序,即 低內存地址空間存儲數據的低位。