今天在專案程式設計中,遇到一個問題,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