网络编程中的常见陷阱之 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;
}



为何不相等呢?

看截图:

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

具体原因:字面值常量也是有默认类型的,具体如下

  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

用字面值常量给变量赋值会出现截断情况,

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

上面是字面值常量的类型,下面是截断的规则,下面这张图是关键

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

正确的做法:

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