在微控制器的程式設計中對於8位、16位、32位整數的分解與合併用的比較多,今天做了簡要學習,後面還需要加以總結。
練習在vc++6.0程式設計環境中進行,源程式:
#include #include "string.h"
int main(int argc, char* ar**)
test1;
unsigned char c1="a";
//定義16位的指標將32位位址強制轉為16位,高位丟棄取低位
unsigned short int *p16=(unsigned short int *)(&data_uint32);
unsigned short int data_uint16_2p,data_uint16_1p;
printf("32位整數:0x%x\n",data_uint32);
printf("-------------------通過指標運算-------------------\n");
data_uint16_2p=*(unsigned short int *)p16;
data_uint16_1p=*((unsigned short int *)p16+1);
printf("轉換後的16位整數:0x%x,0x%x\n",data_uint16_1p,data_uint16_2p);
data_uint8_1= *(unsigned char *)p16;
data_uint8_2= *((unsigned char *)p16+1);
data_uint8_3= *((unsigned char *)p16+2);
data_uint8_4= *((unsigned char *)p16+3);
printf("轉換後的8位整數:0x%x,0x%x,0x%x,0x%x\n",data_uint8_1,data_uint8_2,
data_uint8_3,data_uint8_4);
data_uint8_1=0;data_uint8_2=0;data_uint8_3=0;data_uint8_4=0;
//直接根據指標取值
//將32位的整數分解成兩個16位的整數,再取低位的16位
//強制轉換,丟棄高位的16位
//32位轉16位
data_uint16_1=(unsigned short int)(data_uint32>>16);
data_uint16_2=(unsigned short int)data_uint32;
//32位轉8位
data_uint8_1= (unsigned char)(data_uint32>>24);
data_uint8_2= (unsigned char)(data_uint32>>16);
data_uint8_3= (unsigned char)(data_uint32>>8);
data_uint8_4= (unsigned char)data_uint32;
printf("-------------------通過位運算-------------------\n");
printf("轉換後的16位整數:0x%x,0x%x\n",data_uint16_1,data_uint16_2);
printf("轉換後的8位整數:0x%x,0x%x,0x%x,0x%x\n",data_uint8_1,data_uint8_2,
data_uint8_3,data_uint8_4);
printf("-------------------通過結構運算-------------------\n");
printf("字元a,ascii為01000001,結構轉換後的內容\n");
memcpy(&test1, c1, sizeof(test1));
printf("test1.byte08=%d \n",test1.byte08);
printf("test1.byte07=%d \n",test1.byte07);
printf("test1.byte06=%d \n",test1.byte06);
printf("test1.byte05=%d \n",test1.byte05);
printf("test1.byte04=%d \n",test1.byte04);
printf("test1.byte03=%d \n",test1.byte03);
printf("test1.byte02=%d \n",test1.byte02);
printf("test1.byte01=%d \n",test1.byte01);
data_uint8_1=0x89;data_uint8_2=0xab;data_uint8_3=0xcd;data_uint8_4=0xef;
printf("-------------------通過位運算合併-------------------\n");
data_uint16_1 = (unsigned short int)(data_uint8_1 << 8) | (unsigned short int)(data_uint8_2);
data_uint16_2 = (unsigned short int)(data_uint8_3 << 8) | (unsigned short int)(data_uint8_4);
data_uint32=(unsigned int) (data_uint16_1 << 16) | (unsigned int)(data_uint16_2);
printf("合併前的8位整數:0x%x,0x%x,0x%x,0x%x\n",data_uint8_1,data_uint8_2,data_uint8_3,data_uint8_4);
printf("合併後的16位整數:0x%x,0x%x\n",data_uint16_1,data_uint16_2);
printf("合併後的32位整數:0x%x\n",data_uint32);
return 0;
}
輸出:
在這裡練習以後進入keil uvision5程式設計,想寫個通用的轉換函式,後面想沒有必要,難道8、16位、32位相互轉換這麼複雜嗎?如果這樣,寫在keil uvision5裡面的程式會是多麼複雜,以後自己看起來也會繁瑣的。
接著寫:
直接強制轉換:
printf("-------------------8位到32位轉換-------------------\n");
data_uint8_1=0x00;
data_uint8_2=0x19;
data_uint16_2=0x00;
data_uint16_1 = (unsigned short int)(0x00 << 8) | (unsigned short int)(data_uint8_2);
data_uint32=(unsigned int) (0x00 << 16) | (unsigned int)(data_uint16_1);
printf("轉換前的8位整數:0x%x,%d\n",data_uint8_2,sizeof(data_uint8_2));
printf("8位到32位轉換1*****=>轉換後的32位整數:0x%x,資料長度:%d\n",data_uint32,sizeof(data_uint32));
data_uint32=(unsigned int) (0x00 << 16) | (unsigned int)( (unsigned short int)(0x00 << 8) | (unsigned short int)(data_uint8_2));
printf("8位到32位轉換2*****=>轉換後的32位整數:0x%x,資料長度:%d\n",data_uint32,sizeof(data_uint32));
//data_uint32=(unsigned int) (0x00 << 24) | (unsigned int)(data_uint8_2);
data_uint32= (unsigned int)(data_uint8_2);
printf("8位到32位轉換3*****=>轉換後的32位整數:0x%x,資料長度:%d\n",data_uint32,sizeof(data_uint32));
data_uint32=0x69;
data_uint8_1= (unsigned char)(data_uint32);
printf("32位整數:0x%x,資料長度:%d\n",data_uint32,sizeof(data_uint32));
printf("32位到8位轉換*****=>轉換後的8位整數:0x%x,資料長度:%d\n",data_uint8_1,sizeof(data_uint8_1));
實際輸出:
-------------------8位到32位轉換-------------------
轉換前的8位整數:0x19,1
8位到32位轉換1*****=>轉換後的32位整數:0x19,資料長度:4
8位到32位轉換2*****=>轉換後的32位整數:0x19,資料長度:4
8位到32位轉換3*****=>轉換後的32位整數:0x19,資料長度:4
32位整數:0x69,資料長度:4
32位到8位轉換*****=>轉換後的8位整數:0x69,資料長度:1
說明:8位強制轉32位,前面系統自動加了24位的0;32位強制轉8位,系統只擷取了最後的8位。
mul和div指令(8位,16位,32位)
無符號乘法指令,預設運算元與eax相乘 這裡只說32位,其他與下面的div類似 格式 mul 運算元 運算元只有乙個運算元與eax相乘,結果共有16位 這裡的16位是16進製制數 高8位放在edx中,低8位放在eax中 執行命令下面的命令,此時,ecx為00000005,eax為ffff fff9 ...
8位微控制器 16位 32位區別
8位微控制器 16位 32位區別?指cpu處理的資料的寬度,參與運算的暫存器的資料長度.如果匯流排寬度與cpu一次處理的資料寬度相同,則這個寬度就是所說的微控制器位數。如果匯流排寬度與cpu一次處理的資料寬度不同 1 匯流排寬度小於cpu一次處理的資料寬度,則以cpu的資料寬度定義微控制器的位數,但...
8位16位32位資料的拆分與合併程式
拆分 16位拆成兩個8位 u16 data16 0x1234 u8 data8 h,data8 l data8 h u8 data16 8 data8 l u8 data16 32位拆成4個8位 方法一 u32 data32 0x12345678 u8 data8 1,data8 2,data8 3...