int转为unsigned char类型的警告的分析和解决办法

4686 人浏览 | 时间: 2018-06-23 12:02:23 | 作者: codexia

        在编译一份代码后,发现一个警告,老是出现,如下:

    warning : conversion to ‘unsigned char’ from ‘int’ may alter its value [-Wconversion]
    出现的太多了,就有点烦了。但是整半天还没有消除,感觉这个警告并不是那么简单,所以决心研究一下,彻底研究清楚,下面就是我的研究成果,分享给大家,值得一读。这个分析可以促进你对类型转换的理解。

        先看一份代码:

    

#include <iostream>
using namespace std;
int main()
{
    unsigned char * p = new unsigned char[10];
    unsigned char index = 3;
    p[0] = 'a' + 3;//无警告
    p[1] = 'a' + index;//warning : conversion to ‘unsigned char’ from ‘int’ may alter its value [-Wconversion]
    p[2] = 'a' + 'b';//无警告
    p[3] = (unsigned char)'a' + index;//warning : conversion to ‘unsigned char’ from ‘int’ may alter its value [-Wconversion]
    p[4] = (unsigned char)('a' + index);//无警告
    p[5] = 'a' + (int)index;//warning : conversion to ‘unsigned char’ from ‘int’ may alter its value [-Wconversion]
    p[6] = 'a' + 300;//warning : large integer implicitly truncated to unsigned type [-Woverflow]
    return 0;
}
    注释后面是编译后的结果,部分没有警告,部分有警告,警告的内容也原样写在注释里了。

    

p[0] = 'a' + 300; //字符常量混合计算
p[1] = 'a' + index;//字符常量(char类型)和unsigned char变量的混合计算,因为合并后的范围超出了一个字节的范围,类型提升到int类型,再将int类型转为unsigned char时可能丢失数据而警告
p[2] = 'a' + 'b';//两个char常量的相加,最终得到char常量,再赋值给unsigned char,存在类型转换。但是因为是两个常量,可以预先确定是否存在数据精度丢失问题,此处确定为不存在问题,最终的结果落在unsigned char的范围内,不存在数据丢失问题而不警告。
(unsigned char)'a' + index;//虽然对常量'a'做了类型转换,但是强制的类型转换,有数字常量char转为unsigned char已经将类型提升到了int,再和index混合计算,类型就成了int了。此时会有警告。
p[4] = (unsigned char)('a' + index);//'a' + index的结果虽然被提升为了int类型,但是最终强制转换了类型,所以属于程序员知道的情况,人为处理过了,表示程序员知道这个不会出问题,编译器也不警告了。
p[5] = 'a' + (int)index;//index被强制转为int类型,自然后续的操作会报警告。
    看完之后,我相信,这种警告,就不会再难住你了。
请微信扫码阅读
为防止恶意爬虫,
已开启反爬机制

相关阅读