int型別按位元組列印輸出

shell_nut發表於2019-05-07

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

輸出:
int型別按位元組列印輸出

以上是正確程式碼


以下對程式碼做改變

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;

輸出:
int型別按位元組列印輸出

輸出為什麼是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

相關文章