1.大小端與其檢測方法
大端(存儲)模式:是指一個數據的低位字節序的內容放在高地址處,高位字節序存的內容放在低地址處。
小端(存儲)模式:是指一個數據的低位字節序內容存放在低地址處,高位字節序的內容存放在高地址處。(可以總結爲“小小小”即低位、低地址、小端)
注意這裏說的都是含有字節序的類型的變量,比如int。 而char類型的變量就不能用來檢測,因爲它就一個字節,根本不存在字節序的概念,想檢測也檢測不了。例,一個int型數據0x12345678,它的大小端存放方式分別爲:
地址 | 大端數據 | 小端數據 |
0x200000004 | 0x78 | 0x12 |
0x200000003 | 0x56 | 0x34 |
0x200000002 | 0x34 | 0x56 |
0x200000001 | 0x12 | 0x78 |
檢測方法
方法1. 使用指針
#include <stdio.h>
int main()
{
int i = 1;
char *a = (char *)&i;
if(*a == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
方法2. 使用聯合體
int Check_Sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;//如果是小端返回1,如果是大端返回0
}
int main()
{
if(Check_Sys())
printf("小端\n");
else
printf("大端\n");
return 0;
}
2. 對寄存器某一位操作
嵌入式系統總是要用戶對變量或寄存器進行位操作。給定一個整型變量a,寫兩段代碼,第一個設置a的bit 3,第二個清除a 的bit 3。在以上兩個操作中,要保持其它位不變。【程序員面試寶典】
對這個問題有三種基本的反應
1)不知道如何下手。該被面者從沒做過任何嵌入式系統的工作。
2) 用bit fields。Bit fields是被扔到C語言死角的東西,它保證你的代碼在不同編譯器之間是不可移植的,同時也保證了的你的代碼是不可重用的。我最近不幸看到 Infineon爲其較複雜的通信芯片寫的驅動程序,它用到了bit fields因此完全對我無用,因爲我的編譯器用其它的方式來實現bit fields的。從道德講:永遠不要讓一個非嵌入式的傢伙粘實際硬件的邊。
3) 用 #defines 和 bit masks 操作。這是一個有極高可移植性的方法,是應該被用到的方法。最佳的解決方案如下:
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
一些人喜歡爲設置和清除值而定義一個掩碼同時定義一些說明常數,這也是可以接受的。我希望看到幾個要點:說明常數、|=和&=~操作。