[問題] char與int

看板C_and_CPP (C/C++)作者 (年輕的心)時間14年前 (2012/05/13 14:48), 編輯推噓4(4026)
留言30則, 6人參與, 最新討論串1/3 (看更多)
大家好!小弟使用的程式語言是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

05/13 14:55, , 1F
哪本書跟你說 int 4bytes ...?
05/13 14:55, 1F

05/13 15:08, , 2F
樓上 難道不是嗎?
05/13 15:08, 2F

05/13 15:35, , 3F
49676 = 0xC20C 這個值會先存到暫存器,然後跑 a = c; 時
05/13 15:35, 3F

05/13 15:36, , 4F
就從這個暫存器取出一位元組寫入到 a 裡面,得 0xC
05/13 15:36, 4F

05/13 15:41, , 5F
05/13 15:41, 5F

05/13 15:45, , 6F
請問這程式碼有什麼意思存在嗎?
05/13 15:45, 6F

05/13 15:55, , 7F
謝謝樓上幾位大大的教學與回覆!
05/13 15:55, 7F

05/13 15:56, , 8F
回s大,小弟在做影像處理,raw data 是65536個色階
05/13 15:56, 8F

05/13 15:57, , 9F
以256個色階顯圖時,每個pixel的數值會變化
05/13 15:57, 9F

05/13 15:57, , 10F
例如49676會變成12,小弟另外寫一個小程式來探討其原因
05/13 15:57, 10F

05/13 15:58, , 11F
就是所po的這些程式碼。
05/13 15:58, 11F

05/13 16:34, , 12F
再向purpose請教,依您所說,32268=0x7E0C,
05/13 16:34, 12F

05/13 16:37, , 13F
跑出來的b應該是7,為何是12呢?
05/13 16:37, 13F

05/13 16:38, , 14F
mov eax,7E0C; mov c,al ; 結論 c = 0x0C;
05/13 16:38, 14F

05/13 16:38, , 15F
EdixonX大大所回覆的是什麼意思呀?
05/13 16:38, 15F

05/13 16:41, , 16F
mov eax,7E0C; mov a,al; xor eax,0xFF; mov b,eax
05/13 16:41, 16F

05/13 16:41, , 17F
得b = 12;
05/13 16:41, 17F

05/13 16:42, , 18F
你可以這樣理解,目標數字不管幾位數,只取最右邊的個位數
05/13 16:42, 18F

05/13 16:43, , 19F
取最左邊的話,憑什麼知道第幾位數才算最左邊呢
05/13 16:43, 19F

05/13 16:47, , 20F
我怎麼覺得是個位數+十位數.......
05/13 16:47, 20F

05/13 16:48, , 21F
只是個譬喻呀,重點是往 power 小右邊抓才對
05/13 16:48, 21F

05/13 16:50, , 22F
s大真高手也!剛剛google一下,s大回答的似乎跟組合語
05/13 16:50, 22F

05/13 16:51, , 23F
言有關,這部分小弟就外行了 XD
05/13 16:51, 23F

05/13 16:53, , 24F
p大也是高手!( 剛剛沒看到p大的回覆XD) 多謝兩位了!
05/13 16:53, 24F

05/13 17:08, , 25F
謝謝p大的白話教學,讓我很好懂!這樣子下面的c=29967
05/13 17:08, 25F

05/13 17:10, , 26F
及2320,我也可以知道為何cout出來的b是那樣了 ^^
05/13 17:10, 26F

05/13 19:24, , 27F
我上面的推文請略過,推錯。
05/13 19:24, 27F

05/13 21:19, , 28F
原po的機器應該是little endian的吧
05/13 21:19, 28F

05/13 22:36, , 29F
應該是吧!我也不知道 XD 不過多謝樓上跟我說
05/13 22:36, 29F

05/13 22:39, , 30F
little endian的觀念,上網查了查,我又多知道一種觀念
05/13 22:39, 30F
文章代碼(AID): #1FhrbCYQ (C_and_CPP)
討論串 (同標題文章)
以下文章回應了本文
完整討論串 (本文為第 1 之 3 篇):
4
30
文章代碼(AID): #1FhrbCYQ (C_and_CPP)