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


    项目中遇到的问题,
    将一幅图像二值化(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
    ", ~charvar1);
    	printf("~0x00 = %x
    ", ~0x00);
    	printf("~0xff = %x
    ", ~0xff);
    
    	system("pause");
    	return 0;
    
    }




    如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。
    double ←── float 高
    long
    unsigned
    int ←── char,short 低
    ● 图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。 纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型, 然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的, 使用时你只需从中了解结果的类型即可。这些转换可以说是自动的,当然,C语言也提供了以显式的形式强制转换类型的机制。
  • 相关阅读:
    js的解构
    Go函数
    文件 & IO 操作
    并发编程 & 网络编程
    结构体 & 方法
    Go基础
    go 包
    接口
    JAVA周报4
    JAVA周报6
  • 原文地址:https://www.cnblogs.com/cnsec/p/3789808.html
Copyright © 2020-2023  润新知