以前在做圖像處理的時候,一直不太在意這個問題,對圖像每個像素點的灰階值,總是認為char也可,unsigned char也可。盡管它們都是8位,但是表示的數的範圍卻不相同:char: -128~127, unsigned char: 0~255。很明顯,unsigned char才是正确的選擇。
你可以這樣定義: 1 struct { 2 char r; 3 char g; 4 char b; 5 }pixel_t; 6 也可以這樣定義: 8 struct { 9 unsigned char r; 10 unsigned char g; 11 unsigned char b; 12 }pixel_ut;
如果你不用上面的定義對像素進行算術運算,而隻是進行指派操作,OK, 沒問題。 但一旦進行算術運算,隐含的bug随之而來了。
考慮下面的情況:
2 struct pixel_t pix1;
3 struct pixel_t pix2;
4 struct pixel_ut pix3;
5 struct pixel_ut pix4;
7 int ans0, ans1;
8
9 pix1.r = 127;
10 pix2.r = 129;
11
12 pix3.r = 127;
13 pix4.r = 129;
14
15 ans0 = pix2.r - pix1.r; //ans0 = ?
16
17 ans1 = pix4.r - pix3.r; //ans1 = ?
如果你認為ans0與ans1的值會相等,那你就大錯特錯,他們不僅不等,而且兩者相差甚遠。
ans0 = -254;
ans1 = 2;
原因在于:
當我們把129指派給pix2.r時,由于pix2.r的類型是char,是以pix2.r的值并不是129,而是
-127。是以當我們進行運算時出錯。