| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 785 人关注过本帖
标题:一个printf的问题
只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 5楼 TonyDeng
确实是unsigned  这个问题

对C编译器  + - * /  和 printf函数运作机制的不理解才导致这样的结果的
运算过程中 如果值为负数  比如char c=0xfe  放到printf里面的话他是一个负数  printf的%x 的机制是输出32位的可打印字符
对于前面的char c=0xfe他看到了f 被扩展成了负数的表示形式  悲催了  又被上了一课

[ 本帖最后由 zhu224039 于 2014-3-4 17:32 编辑 ]

我要成为嘿嘿的黑客,替天行道
2014-03-04 17:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你的研究對象是char數據類型(自稱要求輸出每一個字節即是明證),不管是不是unsigned的,它都是一個8位的數據,即2位十六進制形式,你用%02x輸出就是這種數據類型的正當用法,這就叫直觀代碼。莫名其妙地把char當作int來處理,正是因爲對底層内幕知道太多造成的。

你也不要以爲那是什麽擴展形式,對有符號數據而言,當認爲一個整型數是負數的時候,它在整個字長範圍内的所有高位都是1,而不單單是最高位爲1,這個問題我在很早以前分析移位操作的時候就警告過大家的,符號型整數右移操作將把符號位一直帶進來,即左邊不斷填充1,而不是像在聲明爲unsigned時那樣左移右移都會在兩邊填充0。聲明爲8位的負數,它的所有高位都爲1,當你把數據視爲32位(對64位環境下默認int是64位)的時候,它的所有高位都同樣也是1,所以輸出時對不是0的位,也把十六進制的f都輸出來。當你輸入輸出char型數據的時候,按定義它就是8位數據,祇要老老實實地按8位輸出就必定沒錯,不要管什麽C/C++把char隱性視之爲int處理的鬼話——其實輸出時看到char變成16位或32位數據,你都應該知道有問題了,不需要想那麽久才明白道理。

[ 本帖最后由 TonyDeng 于 2014-3-5 20:28 编辑 ]

授人以渔,不授人以鱼。
2014-03-05 19:46
快速回复:一个printf的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028172 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved