Re: [問題] printf & 型態轉換
: → 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
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章