C_and_CPP 板


LINE

: → 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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP