C語言程式設計中的8位 16位 32位整數的分解與合併

2021-09-13 13:53:14 字數 4741 閱讀 4790

在微控制器的程式設計中對於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...