关于char型变量的运算及其他

来源:互联网 发布:java获取项目相对路径 编辑:程序博客网 时间:2024/05/17 04:11
项目中遇到的问题,
将一幅图像二值化(0x00:黑色,0xff:白色),为判断图像边缘,需要判断相邻两个像素是否相反,图像的数据是uchar型的,开始代码如下:
for(int j = 1; j<img->width; j++){tmp = data[i*step+j];if(tmp == ~data[i*step+j-1]){h_count++;}}

h_count始终为0,也就是
if(tmp == ~data[i*step+j-1])
判断永远为假,打印出所有图像数据,发现有相邻的0x00,0xff。这是什么原因?半天不得其解。
原来是uchar型数据在进行操作符运算之前就已经进行了转换,转成int型的,运算的结果也是int型的,0x00先高位补零为:0x00 00 00 00,取反为0xffffffff,与0xff比较就出问题了,同理0xff在运算之前也是先自动转换为int型,(注意不是强制转换),0x00 00 00 ff,取反结果为:0xff ff ff 00.
下面是一些验证:
int main(){unsigned char charvar1 = 0xff;unsigned char charvar2 = 0x00;cout << "chartype bytes: " << sizeof(charvar1) << endl;cout << "operator bytes: " << sizeof(~charvar1) << endl;printf("~charvar1 = %x\n", ~charvar1);printf("~0x00 = %x\n", ~0x00);printf("~0xff = %x\n", ~0xff);system("pause");return 0;}




如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。
double ←── float 高
long
unsigned
int ←── char,short 低
● 图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。 纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型, 然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的, 使用时你只需从中了解结果的类型即可。这些转换可以说是自动的,当然,C语言也提供了以显式的形式强制转换类型的机制。
0 0
原创粉丝点击