1. 程式人生 > >網絡編程中的常見陷阱之 0x十六進制數(C++字面值常量)

網絡編程中的常見陷阱之 0x十六進制數(C++字面值常量)

十六進制 aid word 網絡編程 情況 技術分享 fill 截斷 常見

十六進制數相等的推斷

請問例如以下程序的輸出是神馬?

#include <iostream>
#include <string>
using namespace std;

int  main (int, char *[])
{
    char s[1]={0};

    s[0] = 0xfe;
    if (s[0] == 0xfe)
    {
        cout<<"=="<<endl;
    }
    else
    {
        cout<<"!="<<endl;
    }

    return 0;
}


技術分享

為何不相等呢?

看截圖:

技術分享

詳細原因:字面值常量也是有默認類型的,詳細例如以下

  1. 整形字面值常量(0xfe。0x124,123,0)的類型是int
  2. 字符字面值常量(‘\0‘,‘0‘,‘a‘)的類型是char
  3. 布爾字面值常量(true,false)的類型是bool
  4. 字符串字面值("abc")的類型是const char*

http://zhidao.baidu.com/question/198400742.html?

qbl=relate_question_1&word=C%2B%2B%20%CA%FD%D6%B5%C4%AC%C8%CF%C0%E0%D0%CD

用字面值常量給變量賦值會出現截斷情況,

技術分享

上面是字面值常量的類型,以下是截斷的規則。以下這張圖是關鍵

技術分享

正確的做法:

(1)用字面值常量賦值的時候保證左操作數的類型能夠包容又操作數的值(0x**的一個字節十六進制字面值都能夠被char包括。所以能夠放心賦值)

(2)用變量和字面值進行邏輯和關系運算時,考慮字面值的默認類型和變量類型是否同樣(不同樣會發生隱式類型轉換)。同樣時看看字面值會不會發生(1)的情況

#include <iostream>
#include <string>
using namespace std;

int  main (int, char *[])
{
    char s[1]={0};
    s[0] = (char)0xfe;// s[0] = fe , s[0] < 0
    if (s[0] == (char)0xfe) //禁止類型轉換到int
    {
        cout<<"=="<<endl;
    }
    else
    {
        cout<<"!="<<endl;
    }
    return 0;
}


所以,char變量賦值常數的時候要強制轉換,推斷相等的時候避免轉換到int




網絡編程中的常見陷阱之 0x十六進制數(C++字面值常量)