关于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
- 关于char型变量的运算及其他
- char型变量参加运算时的技巧
- 关于vss的一些资料及其他
- 关于openlayers的参数及其他
- 关于屏幕自适应的资料及其他。。。
- 关于char型变量与字符串地址的输出
- c++: 关于char型变量与字符串地址的输出
- 关于C++中char 型变量的地址输出
- Talend中变量载入(tContextLoad)的用法,及其他注意事项
- Java变量及其运算
- 更新日志 - 关于 iOS9 设备的安装及其他优化
- 关于dota及其他游戏的数理分析
- 不用第三个变量及其他函数等交换两个变量的值
- c++中关于char型变量与字符串地址的输出
- char的整型运算
- Char类型的运算
- char * 类型的变量和 char 型数组重新赋值
- 函数的副作用及其他
- 动网论坛密码暴力破解程序代码
- Codeforces 432E Square Tiling(构造+贪心)
- 学习的一些事
- 【索引】Codeforces Round #246 (Div. 2)
- Java中类的初始化块问题(一)
- 关于char型变量的运算及其他
- 重装系统和安装搭建开发环境注意
- C/C++ 宏定义
- Java1.5新特性之注解
- 出现链接错误:无法解析的外部命令
- ir+关联规则
- SQL Server2008远程调用过程失败
- Linux下时间/时区的设置
- 一般筛法求素数+快速线性筛法求素数