C/C++ uchar的一个有趣用法

bat365官方网站 📅 2025-07-14 03:45:19 👤 admin 👁️ 6106 ❤️ 604
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

...

std::bitset 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

相关养生推荐

驰为 VX8(8GB/8英寸)网友点评
bat365官方网站

驰为 VX8(8GB/8英寸)网友点评

📅 06-30 👁️ 9411
赌博判刑会判多久刑期
365bet体育手机

赌博判刑会判多久刑期

📅 07-11 👁️ 9214
在excel中怎么求和
365bet体育手机

在excel中怎么求和

📅 06-29 👁️ 607
中国十大裸体模特(组图)
bat365官方网站

中国十大裸体模特(组图)

📅 06-27 👁️ 1259