寫一個C程式判斷系統是32或64位、大端或小端位元組序
阿新 • • 發佈:2019-01-11
一、判斷系統是32位或64位32位處理器一次只能處理32位,也就是4個位元組的資料,虛擬地址空間的最大值是4G。64位處理器一次能處理64位,也就是8個位元組的資料,虛擬地址空間的最大值是16T。32位處理器:系統指標(32位 ),long(32位),int(32位),short(16位)64位處理器:系統指標(64位 ),long(64位),int(32位),short(16位) 來進行64位編碼。
#include <stdio.h>
int main()
{
void *ptr = 0;
printf("%d\n", sizeof(ptr));
}
gcc以__i386__來進行32位編碼,以__x86_64__#include <stdio.h>
int main()
{
#ifdef __x86_64__
printf("__x86_64__\n");
#elif __i386__
printf("__i386__\n");
#endif
return 0;
}
二、判斷系統是大端還是小端大端模式:字資料的高位元組儲存在低地址中,字資料的低位元組存放在高地址中。big endian小端模式:字資料的高位元組儲存在高地址中,字資料的低位元組存放在低地址中。little endian1、直接判斷記憶體的儲存情況// 1: Little Endian; 0: Big Endian.
int isLittleEndian(void)
{
int i = 0x12345678;
char *c = (char *)&i;
return ((c[0] == 0x78) && (c[1] == 0x56) && (c[2] == 0x34) && (c[3] == 0x12));
}
2、用union方法判斷讀取成員c就相當於是讀取成員a的低位的第一個位元組值。小端模式:u.i = 1,則a的最低位位元組為1,成員c的位置也是記憶體的最低位位元組,所以u.i等於u.c等於1。typedef union { int i; char c; } myUnion; // 1: Little Endian; 0: Big Endian. int isLittleEndian02(void) { myUnion u; u.i = 1; return (u.i == u.c); }