作者drag (京都念慈庵,贾诩念费翔)
标题Re: [问题] printf & 型态转换
时间Fri Feb 19 16:49:28 2016
: → 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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1455871770.A.B20.html
※ 编辑: drag (61.220.35.170), 02/19/2016 16:53:30
1F:推 ss780217: 推推 很清楚 02/19 21:13
2F:推 overhead: 超清楚的 02/20 01:14