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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM