1. 程式人生 > >寫一個C程式判斷系統是32或64位、大端或小端位元組序

寫一個C程式判斷系統是32或64位、大端或小端位元組序

一、判斷系統是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位)
#include <stdio.h>

int main()
{
    void *ptr = 0;
    printf("%d\n", sizeof(ptr));
}
gcc以__i386__來進行32位編碼,以__x86_64__
來進行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方法判斷
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);
}
讀取成員c就相當於是讀取成員a的低位的第一個位元組值。小端模式:u.i = 1,則a的最低位位元組為1,成員c的位置也是記憶體的最低位位元組,所以u.i等於u.c等於1。