首页 > 代码库 > 网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)

网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)

十六进制数相等的推断

请问例如以下程序的输出是神马?

#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++字面值常量)