C++中int類型按字節(jié)打印輸出的方法
前言
今天在項目編程中,遇到一個問題,u32類型的參數(shù),要賦值給一個u8 array[3],想用memcpy()函數(shù)進行賦值,由于類型大小不一致,一時不知道怎么做,經(jīng)過查找,得以解決。說明如下;
項目是在內(nèi)網(wǎng)中做,在查找過程中用自己筆記本做了一下實驗,vs2013版本。
類似主題是int類型按字節(jié)打印數(shù)據(jù),sizeof(int)實驗驗證后為4字節(jié),就分別打印出這4個字節(jié)中的數(shù)值。
先貼上代碼
#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類型是有符號字符型變量還是無符號字符型變量,要看編譯器是怎么定義的,不能想當(dāng)然。char變量為一個字節(jié),8bit,sighed char表示的范圍是-128~127,(-128在內(nèi)存中二進制表示為1000 0000,127在內(nèi)存中二進制表示為0111 1111),unsighed char表示的范圍是0~255.
給 i 賦值128,十六進制0x80,二進制1000 0000,相當(dāng)于是給char變量賦值-128.
printf()函數(shù)的參數(shù)%x其含義為Unsigned hexadecimal integer;即輸出一個十六進制的整型,而在代碼中,%x對應(yīng)的是char類型,所以此時printf()函數(shù)會將char類型隱式轉(zhuǎn)換為int類型。
對于int類型的對象,其值為-128,則其對應(yīng)的內(nèi)存值是0xFFFFFF80
所以,在printf()函數(shù)中,char類型隱式轉(zhuǎn)換成int類型后,輸出就會變成4字節(jié)的0xFFFFFF80
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
C語言實現(xiàn) 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)
這篇文章主要介紹了 C語言 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
本篇文章是對HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用進行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05探討register關(guān)鍵字在c語言和c++中的差異
建議不要用register關(guān)鍵字定義全局變量,因為全局變量的生命周期是從執(zhí)行程序開始,一直到程序結(jié)束才會終止,而register變量可能會存放在cpu的寄存器中,如果在程序的整個生命周期內(nèi)都占用著寄存器的話,這是個相當(dāng)不好的舉措2013-10-10