char、unsigned char與字面值比較的相關問題

最近做一個項目,定義了一個char數組,裏面存放別人發送過來的消息。定義的消息頭是0xff0xff,所以我收到消息後就與0xff進行比較,結果卻發現不相等。看了一些資料,發現還是自己對基礎知識的掌握不到位。

首先,我寫了個測試程序,代碼及運行結果如下:

void test_num()
 {
    char a = 0x01;
    char b = 0xfe;
    unsigned char c = 0xfe;
    printf("a=%02x\n",a);
    printf("b=%02x\n",b);
    printf("c=%02x\n",c);
    printf("fe=%02x\n",0xfe);
    printf("(char)fe=%02x\n",(char)0xfe);
    printf("-1=%02x\n",-1);
    if( a == 0x01)
        cout<<"a == 0x01"<<endl;
    if( b == 0xfe)
        cout<<"b == 0xfe"<<endl;
    if( b == (char)0xfe)
        cout<<"b == (char)0xfe"<<endl;
    if( c == 0xfe)
        cout<<"c == 0xfe"<<endl;
    if( 255 == 0xff)
        cout<<"255 == 0xff"<<endl;
    if( -1 == 0xff)
        cout<<"-1 == 0xff"<<endl;
    if( -1 == 0xffffffff)
        cout<<"-1 == 0xffffffff"<<endl;
 }

執行結果如下:

分析:print 02x打印的是int值,現在我們傳遞的都是char類型,所以首先就存在着類型轉換。char是8位的,大部分系統下int是32位的,所以首先需要補24位的數據。那數據應該補什麼呢,實際上是看這個變量的正負情況的,正數則補0,負數補1.這個具體可以參考

https://blog.csdn.net/qq_39165336/article/details/78383239,此文對此進行了詳細的測試。

後面進行的==判斷,一邊是char類型,一邊是字面值常量。那這個字面值常量是什麼類型呢?經查詢相關文檔得知字面值常量是int、unsigned int、long、unsigned long、long long、unsigned long long的較小值。所以前面幾個都是char和int進行比較,這就涉及到剛剛說過的類型轉換。最後一個字面值常量是unsigned int,所以需要將char轉換爲unsigned int,在擴展符號位之後將其理解爲一個正數,實際上也就是取模。最終顯示他們是相等。

最後說一句,如果我們是想存一個字符串,可以定義一個char數組,如果只是想開闢一個內存保存一些二進制數據,最好定義爲unsigned char。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章