作者lopohsiung (年輕的心)
看板C_and_CPP
標題Re: [問題] char與int
時間Sun May 13 21:59:01 2012
之前提出的問題,得到板上的高手回應,不勝感激!小弟尚有一疑問,想請教大家!
先舉前面兩個例子:
char a;
int b,c;
c=49676;
a=c;
b=a;
cout<<b<<endl;
cout出來的b是12。
假如c=2320,也就是:
char a;
int b,c;
c=2320;
a=c;
b=a;
cout<<b<<endl;
cout出來的b是16。
小弟的疑問是:電腦這樣算合理嗎?依照小弟的想法,49676及2320都超過char最大所
能存的範圍,如果要「縮」到127以內,應該是同除一個數,隨便假設,假設是512好了!
這樣子「等比例」縮小才合理呀!為何電腦是用取模的方式處理,這樣子本來49676比較
大,但「縮」到127以內後卻是12,2320比較小,但「縮」到127以內後卻是16,這樣子不
是很奇怪嗎?
在前面文章的推文裡,小弟曾提到自己在做影像處理,欲將原本65536個色階的
raw data以256個色階顯示,照理說如果電腦這樣子取模後所得的結果,應該會讓原本
65536個色階時的色階強弱順序全部亂掉(例如49676原本色階的值比較大,2320色階的值
比較小,而且小很多,可是「縮」到127以內後,前者變成12,後者變成16),可是顯出來
的圖竟極為合理,為什麼沒有像預期中因為像素色階的強弱順序亂掉而顯出一張亂七八糟
的圖呢?
這真是一個很詭異的問題,小弟百思不得其解,懇請高手們解答,萬分感謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.240.230.141
→ linotwo:你可以把 int 跟 char 視為一個 counter 05/13 22:16
→ linotwo:當數字數到最大值的時候,會再從最小值開始數 05/13 22:17
→ linotwo:例如二進位的 char 從 00000000 開始 到 11111111 05/13 22:18
→ linotwo:下一個就是 00000000 05/13 22:18
→ kdjf:你的65536個色階是R+B+G的內容吧,換成256後等於只取一個顏色? 05/13 22:19
→ linotwo:如果是 int 的話 11111111 的下一個會是 100000000 05/13 22:19
→ linotwo:65536 階的 unsigned short 轉成 256 階只要 shift 就好了 05/13 22:21
→ linotwo:B = A << 8; B是256階 A是65536階 05/13 22:22
→ linotwo:好像反了 應該是 >> 05/13 22:24
→ lopohsiung:謝謝linotwo大大的教學! 05/13 22:25
→ lopohsiung:回kdjf大大,我的影像是高光譜影像,有191個波段 05/13 22:28
→ lopohsiung:每個波段的「灰階值」範圍為0~65535,換成256後, 05/13 22:30
→ lopohsiung:一樣會取三個波段去顯圖 05/13 22:31