看板 C_and_CPP 關於我們 聯絡資訊
大家好!小弟使用的程式語言是VC++2010,近來使用寫程式遇到一個問題,很需要清楚明白的知道 為什麼,故來請教各位高手。 程式碼很短: char a; int b,c; c=49676; a=c; b=a; cout<<b<<endl; cout出來的b是12。 假如c=32268,也就是: char a; int b,c; c=32268; a=c; b=a; cout<<b<<endl; cout出來的b是12。 假如c=29967,也就是: char a; int b,c; c=29967; a=c; b=a; cout<<b<<endl; cout出來的b是15。 假如c=2320,也就是: char a; int b,c; c=2320; a=c; b=a; cout<<b<<endl; cout出來的b是16。 到底是為什麼呢?小弟知道char的儲存空間是1byte,儲存值範圍為-128~127,int的話, 書上寫在32位元系統下儲存空間、範圍與long相同,也就是儲存空間是4bytes,儲存值範 圍是-2147483648~2147483647,隱約覺得跟儲存值範圍有關,但確切的原因,電腦到底是 怎麼算的?為什麼cout出來的b會是這樣?能否請知道的大大解說一下?非常感謝!!! 對了!補充一點,小弟的電腦是win7 64位元。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.240.230.141
loveme00835:哪本書跟你說 int 4bytes ...? 05/13 14:55
lopohsiung:樓上 難道不是嗎? 05/13 15:08
purpose:49676 = 0xC20C 這個值會先存到暫存器,然後跑 a = c; 時 05/13 15:35
purpose:就從這個暫存器取出一位元組寫入到 a 裡面,得 0xC 05/13 15:36
EdisonX:#1DyGJ9Oy 05/13 15:41
stupid0319:請問這程式碼有什麼意思存在嗎? 05/13 15:45
lopohsiung:謝謝樓上幾位大大的教學與回覆! 05/13 15:55
lopohsiung:回s大,小弟在做影像處理,raw data 是65536個色階 05/13 15:56
lopohsiung:以256個色階顯圖時,每個pixel的數值會變化 05/13 15:57
lopohsiung:例如49676會變成12,小弟另外寫一個小程式來探討其原因 05/13 15:57
lopohsiung:就是所po的這些程式碼。 05/13 15:58
lopohsiung:再向purpose請教,依您所說,32268=0x7E0C, 05/13 16:34
lopohsiung:跑出來的b應該是7,為何是12呢? 05/13 16:37
stupid0319:mov eax,7E0C; mov c,al ; 結論 c = 0x0C; 05/13 16:38
lopohsiung:EdixonX大大所回覆的是什麼意思呀? 05/13 16:38
stupid0319:mov eax,7E0C; mov a,al; xor eax,0xFF; mov b,eax 05/13 16:41
stupid0319:得b = 12; 05/13 16:41
purpose:你可以這樣理解,目標數字不管幾位數,只取最右邊的個位數 05/13 16:42
purpose:取最左邊的話,憑什麼知道第幾位數才算最左邊呢 05/13 16:43
stupid0319:我怎麼覺得是個位數+十位數....... 05/13 16:47
purpose:只是個譬喻呀,重點是往 power 小右邊抓才對 05/13 16:48
lopohsiung:s大真高手也!剛剛google一下,s大回答的似乎跟組合語 05/13 16:50
lopohsiung:言有關,這部分小弟就外行了 XD 05/13 16:51
lopohsiung:p大也是高手!( 剛剛沒看到p大的回覆XD) 多謝兩位了! 05/13 16:53
lopohsiung:謝謝p大的白話教學,讓我很好懂!這樣子下面的c=29967 05/13 17:08
lopohsiung:及2320,我也可以知道為何cout出來的b是那樣了 ^^ 05/13 17:10
EdisonX:我上面的推文請略過,推錯。 05/13 19:24
cobrasgo:原po的機器應該是little endian的吧 05/13 21:19
lopohsiung:應該是吧!我也不知道 XD 不過多謝樓上跟我說 05/13 22:36
lopohsiung:little endian的觀念,上網查了查,我又多知道一種觀念 05/13 22:39