Re: [問題] printf & 型態轉換

看板C_and_CPP (C/C++)作者 (京都念慈庵,賈詡念費翔)時間10年前 (2016/02/19 16:49), 10年前編輯推噓2(200)
留言2則, 2人參與, 最新討論串2/2 (看更多)
: → vvrr: 1. int a 轉成 char b的時候,不論正負只留最後1個byte : → vvrr: 2. char b傳進printf前會根據b此時代表數值轉成signed int : → vvrr: 3. printf實際上印出來的都是int.有些只看到1byte的只是前面 : → vvrr: 都是0(而且我沒有叫printf印出來) 大概是這樣沒錯吧 學弟, 看到最後這樣推文, 有點擔心, 覺得也許你還沒想通 就當自己雞婆多說一些 本想回你私信, 但搞不好我下面講的東西有誤,還想請版上各位大大幫忙校正 就如各位大大的推文, 主要關鍵在 "2補數" 和 "sign extension" (其實本想偷虧你: 猴喔喔~~~!!!邏設課本忘光了齁?我要回去告似老師~ 後來發現只是誤會printf()而已) ※ 引述《vvrr (vvrr)》之銘言: : 餵入的資料(Input): : int a = 5000; : char b = (char)a; : printf("b = %x\n", b); : 補充說明(Supplement): : : 嘗試了一些a的初始值和結果,有點不太明白為什麼會變成這樣,整理如下: : : int a = 5000; --> b = ffffff88 : int a = 0x1234; --> b = 34 : : 主要是前兩個,為什麼一個會印出ffffff,一個就不會? 我沒看完所有推文,單純針對你原來問題 這邊假定你的char是8bit char,有些平台是16b,所以有人會問你是哪種char? 然後假定你的int是32bit DEC HEX unsigned char 範圍 0 ~ 255 0x00 ~ 0xFF signed char 範圍 127 ~ -128 0x7F ~ 0x80 (疑?) ㄟ等等...signed這邊我們再來一次 0~127 ==> 0x00 ~ 0x7F 0~-128 ==> 0x00 ~ 0x80 -1 = 0xFF -2 = 0xFE ....(其他請自己算) -126 = 0x82 -127 = 0x81 -128 = 0x80 所以當你是signed的宣告時,通常要注意最高bit, 最高bit為1,這個數字是負數 所以我都懶人,沒有必要時盡量都用unsigned xxx signed char的時候binary如下: 0x80 == 1000 0000b = -128(DEC) 對不起我懶的用2補數算給你看, 上面都是按windows小算盤-工程師模式得到的@@ 好的回到題目--(不好意思我繼續按小算盤,然後我把名字上編號) int a1 = 5000; // = 0x1388 int a2 = 0x1234; 當把32bit的變數放入一個8bit容器, 只會進最低byte,其他切掉(我的認知啦~) 大概會等同是這樣: char b = (char)(a & 0x000000FF); 那你又是怎定義的呢? char b1 = (char)a1; char b2 = (char)a2; 單純不看signed的部分, 其實現在 b1=0x88, b2=0x34 應該沒錯 不過因為用了signed char, 那麼你這兩個變數十進位是多少呢? HEX DEC b1 = 0x88 == -120 (不是136喔!) b2 = 0x34 == 52 接下來 printf("b1 = %x, b2 = %x\n", b1, b2); 你推文底下也有大大說了 像printf() 這種vararg function 會把比int容量小的變數轉換int處理 所以signed char會升級成signed int然後再塞進去%x印出 8bit塞32bit容器因為沒有truncate問題, 會把值原汁原味放進去 這樣來說 //b2 = 0x34 = 52 = (int)0x00000034 int c2 = (int)b2; //也就是說 c2 = 34 這樣可以理解 那b1怎辦? //b1 = 0x88 = -120 = (int)0x? int c1 = (int)b1; //也就是說 c1 = -120 所以c1 = 0xFFFFFF88 (sign extension, 小算盤0-120之後 換成HEX mode看看,我的有7組FF,aka 64bit) 參考: 這個人問的問題跟你類似 http://goo.gl/BPBKJN printf() http://goo.gl/DLjsRO 希望有幫到你 突然覺得自己有點多講了...其實有大大獎很清楚了...囧 -- 歪果人都很NICE的,這其中一定有什麼誤會 —╲) ▄▂ \ 為愛走天涯 ▄▄ ® ▂▄from never1111 & Wii -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.220.35.170 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1455871770.A.B20.html ※ 編輯: drag (61.220.35.170), 02/19/2016 16:53:30

02/19 21:13, , 1F
推推 很清楚
02/19 21:13, 1F

02/20 01:14, , 2F
超清楚的
02/20 01:14, 2F
文章代碼(AID): #1MnjSQiW (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1MnjSQiW (C_and_CPP)