前言
今天在項目編程中,遇到一個問題,u32類型的參數,要賦值給一個u8 array[3],想用memcpy()函數進行賦值,由于類型大小不一致,一時不知道怎么做,經過查找,得以解決。說明如下;
項目是在內網中做,在查找過程中用自己筆記本做了一下實驗,vs2013版本。
類似主題是int類型按字節打印數據,sizeof(int)實驗驗證后為4字節,就分別打印出這4個字節中的數值。
先貼上代碼
#include<iostream>using namespace std;int main(){ int i = 128; cout << sizeof(int) << endl; unsigned char* cc = (unsigned char*)&i; for (int j = 0; j < 4; j++) printf("cc: %p /t *cc: %x/n", cc + j, *(cc + j)); system("pause"); return 0;}輸出:

以上是正確代碼
以下對代碼做改變
unsigned char* cc = (unsigned char*)&i;改為 char* cc = ( char*)&i; //代碼如下:#include<iostream>using namespace std;int main(){ int i = 128; cout << sizeof(int) << endl; char* cc = ( char*)&i; for (int j = 0; j < 4; j++) printf("cc: %p /t *cc: %x/n", cc + j, *(cc + j)); system("pause"); return 0;輸出:

輸出為什么是ffffff80呢?
char類型是有符號字符型變量還是無符號字符型變量,要看編譯器是怎么定義的,不能想當然。char變量為一個字節,8bit,sighed char表示的范圍是-128~127,(-128在內存中二進制表示為1000 0000,127在內存中二進制表示為0111 1111),unsighed char表示的范圍是0~255.
給 i 賦值128,十六進制0x80,二進制1000 0000,相當于是給char變量賦值-128.
printf()函數的參數%x其含義為Unsigned hexadecimal integer;即輸出一個十六進制的整型,而在代碼中,%x對應的是char類型,所以此時printf()函數會將char類型隱式轉換為int類型。
對于int類型的對象,其值為-128,則其對應的內存值是0xFFFFFF80
所以,在printf()函數中,char類型隱式轉換成int類型后,輸出就會變成4字節的0xFFFFFF80
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。
新聞熱點
疑難解答
圖片精選