C/C++ uchar的一个有趣用法
本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/51377490
图像处理中常常使用的一种数据类型uchar
,一般它指的就是unsigned char
,可以查到它的定义为:
typedef unsigned char uchar;
是一种8-bit无符号整形数据,范围为[0, 255]
(与之相对应的是schar
,定义为typedef signed char schar
,取值范围是[-128, 127]
),与8-bit图像的灰度级[0, 255]
一一对应,所以图像灰度操作的时候经常使用(十六进制的0xff
对应于十进制的255
)。
#define CHAR_BIT 8 /* number of bits in a char */
#define SCHAR_MIN (-128) /* minimum signed char value */
#define SCHAR_MAX 127 /* maximum signed char value */
#define UCHAR_MAX 0xff /* maximum unsigned char value */
接下来说一说有趣的用法:
cout << int( (uchar)-1 ) << endl;
这句的结果会是什么呢?首先句代码是可以编译通过的,输出结果是255
!
-1
对应的有符号整形二进制为:11111111
,获得方式如下:
//#include <bitset>
...
std::bitset<sizeof(signed char)*8> a(-1);
cout << a << endl;
// print: 11111111
所以(uchar)-1
可以视为是在进行与运算:
1 1 1 1 1 1 1 1 // AND
& & & & & & & &
1 1 1 1 1 1 1 1
这里用&
表示与运算吧,因此对应的二进制结果仍为11111111
,也就是十进制的255
。
同理如果是(uchar)-2
,对应的就是254
~
此外,语句(uchar)~0
与(uchar)-1
如出一辙:从左往右,依次进行位取反和位与运算:
~ 0 0 0 0 0 0 0 0 // NOT
| | | | | | | |
1 1 1 1 1 1 1 1 // AND
& & & & & & & &
1 1 1 1 1 1 1 1
因此,可得:
bool issame = (uchar)~0 == (uchar)-1;
cout << issame << endl;
// print: 1