我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

« 1 2» Pages: ( 1/2 total )
本页主题: char和unsigned char 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

zhd32



性别: 帅哥 状态: 该用户目前不在线
等级: 版主
家族: YD一族
发贴: 619
威望: 0
浮云: 543
在线等级:
注册时间: 2006-04-22
最后登陆: 2009-06-22

5come5帮你背单词 [ scrap /skræp/ n. 小片,碎片;vt. 废弃 ]


char和unsigned char

Copy code
char  ch  =  -1;
printf( "%2x %2x ",ch, (unsigned  char)ch);


输出是什么
GG些讨论下哈
顶端 Posted: 2007-11-08 23:28 | [楼 主]
yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ accumulate /ə'kju:mjuleit/ vt. 积累,积聚;vi. 堆积,积累 ]


输出:
Copy code
ffffffff ff


我比较好奇的是为什么前面那个会输出“ffffffff”
顶端 Posted: 2007-11-09 10:36 | [1 楼]
jon986cn





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 486
威望: 0
浮云: 1143
在线等级:
注册时间: 2005-10-06
最后登陆: 2008-06-21

5come5帮你背单词 [ ripe /raip/ a. 成熟的 ]


char是有符号字符型,故16进制强制转换后就是-1.而2,8,16进制在计算机中是以补码形式存在的,故第一个输出fffffffff.unsigned char是无符号字符型,范围是0~255,-1首先要被转化为-1+256=255,再16进制表示后就是ff。%2x表示的是输出最多到小数点后两位
顶端 Posted: 2007-11-09 11:23 | [2 楼]
zhd32



性别: 帅哥 状态: 该用户目前不在线
等级: 版主
家族: YD一族
发贴: 619
威望: 0
浮云: 543
在线等级:
注册时间: 2006-04-22
最后登陆: 2009-06-22

5come5帮你背单词 [ prevail /pri'veil/ vt. 胜过,获胜,流行,普遍 ]


Copy code
char  ch  =  -1;
printf( "%2x %2x ",ch, (unsigned  char)ch);

到现在我只发现  ch 入栈时是做了带符号扩展的
(unsigned  char)ch 入栈时做了无符号扩展
饭吃完了再来实验下~~

大概是这么回事:
整形数(包括 short / char)i 作为实参传递给 printf 时
如果 i  定义为 unsigned 的,则作 无符号扩展 后压栈
如果 i    未定义为 unsigned 的,则作 带符号扩展 后压栈
顶端 Posted: 2007-11-09 12:21 | [3 楼]
jon986cn





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 486
威望: 0
浮云: 1143
在线等级:
注册时间: 2005-10-06
最后登陆: 2008-06-21

5come5帮你背单词 [ motherland // n. 祖国 ]


对的,第二个就是先做了无符号扩展,因为它必须转换成无符号数
顶端 Posted: 2007-11-09 12:38 | [4 楼]
zhd32



性别: 帅哥 状态: 该用户目前不在线
等级: 版主
家族: YD一族
发贴: 619
威望: 0
浮云: 543
在线等级:
注册时间: 2006-04-22
最后登陆: 2009-06-22

5come5帮你背单词 [ bloody /'blΛdi/ a. 流着血的,有血的;血腥的,残忍的 ]


Quote:
引用第4楼jon986cn于2007-11-09 12:38发表的  :
对的,第二个就是先做了无符号扩展,因为它必须转换成无符号数

不是必须转换成无符号数,第二个是因为 “是” 无符号数,所以才作无符号扩展
“有”符号数作带符号扩展
顶端 Posted: 2007-11-09 13:08 | [5 楼]
jon986cn





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 486
威望: 0
浮云: 1143
在线等级:
注册时间: 2005-10-06
最后登陆: 2008-06-21

5come5帮你背单词 [ reserve /ri'zə:v/ vt. 储备,保留,预定;n. 储备(物)保留地,节制,谨慎 ]


怎么“是”无符号数啊。它(ch)本来就被你定义是个有符号数,然后通过(unsigned char)强制转换为无符号数。这个时候ch已经溢出了(因为unsigned char的范围是0~255,而ch是-1),所以它被转换成无符号数-1+256=255=0xff
顶端 Posted: 2007-11-09 13:37 | [6 楼]
zhd32



性别: 帅哥 状态: 该用户目前不在线
等级: 版主
家族: YD一族
发贴: 619
威望: 0
浮云: 543
在线等级:
注册时间: 2006-04-22
最后登陆: 2009-06-22

5come5帮你背单词 [ veteran /'vetərən/ n. 老兵,退伍军人,老手,老练者;a. 老练的 ]


Quote:
引用第6楼jon986cn于2007-11-09 13:37发表的  :
怎么“是”无符号数啊。它(ch)本来就被你定义是个有符号数,然后通过(unsigned char)强制转换为无符号数。这个时候ch已经溢出了(因为unsigned char的范围是0~255,而ch是-1),所以它被转换成无符号数-1+256=255=0xff

所以我在是上加了个引号就是这个意思噻~~
顶端 Posted: 2007-11-09 13:39 | [7 楼]
zhd32



性别: 帅哥 状态: 该用户目前不在线
等级: 版主
家族: YD一族
发贴: 619
威望: 0
浮云: 543
在线等级:
注册时间: 2006-04-22
最后登陆: 2009-06-22

5come5帮你背单词 [ arrest /ə'rest/ n. 一系列,大量,排列,数组;vt. 排列 ]


Quote:
引用第6楼jon986cn于2007-11-09 13:37发表的  :
怎么“是”无符号数啊。它(ch)本来就被你定义是个有符号数,然后通过(unsigned char)强制转换为无符号数。这个时候ch已经溢出了(因为unsigned char的范围是0~255,而ch是-1),所以它被转换成无符号数-1+256=255=0xff


还有,内存里放的本来就是 0xFF,通过不同的方式访问有不同的意义
顶端 Posted: 2007-11-09 13:41 | [8 楼]
jon986cn





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 486
威望: 0
浮云: 1143
在线等级:
注册时间: 2005-10-06
最后登陆: 2008-06-21

5come5帮你背单词 [ subject /'sΛbd3əikt, sΛb'd3əekt/ n. 主题,题目,学科,科目,实验对象;a. 从属的,受…支配的;vt. 使服从,使遭受 ]


同样的,有符号数的溢出也一样处理。比如定义一个char ch=128(char的范围是-128~127),这个时候ch溢出,则计算机必须把它转换为有效范围内,故你打印可以发现ch=128-256=-128。如果转换为16进制,则计算机用补码表示。如以下例子:
char ch = 128;
printf("%d\n",ch);
//打印的结果是-128

char ch = 0x80;
printf("%x\n",ch);
//打印的结果是ffffff80(-128的补码)
顶端 Posted: 2007-11-09 13:45 | [9 楼]
jon986cn





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 486
威望: 0
浮云: 1143
在线等级:
注册时间: 2005-10-06
最后登陆: 2008-06-21

5come5帮你背单词 [ age /eid3/ n. 年龄,时代;v. (使)变老,(使)老化 ]


不知道LZ说的“通过不同的方式访问有不同的意义”是什么意思??
顶端 Posted: 2007-11-09 13:45 | [10 楼]
jon986cn





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 486
威望: 0
浮云: 1143
在线等级:
注册时间: 2005-10-06
最后登陆: 2008-06-21

5come5帮你背单词 [ reality /ri'æliti/ n. 现实,实际,真实;逼真 ]


而且在你的例子中,内存里面放的当然是0xff,因为本来就是CPU完成转换后放入内存的
顶端 Posted: 2007-11-09 13:47 | [11 楼]
zhd32



性别: 帅哥 状态: 该用户目前不在线
等级: 版主
家族: YD一族
发贴: 619
威望: 0
浮云: 543
在线等级:
注册时间: 2006-04-22
最后登陆: 2009-06-22

5come5帮你背单词 [ grease /gri:s, gri:z/ n. 动物脂,油脂;vt. (给机器)涂油 ]


Quote:
引用第10楼jon986cn于2007-11-09 13:45发表的  :
不知道LZ说的“通过不同的方式访问有不同的意义”是什么意思??

比如:
0x12345678 处的内容为 0xFF
通过一个char去访问,就是-1,通过一个unsigned char 去访问,就是 255
顶端 Posted: 2007-11-09 13:48 | [12 楼]
zhd32



性别: 帅哥 状态: 该用户目前不在线
等级: 版主
家族: YD一族
发贴: 619
威望: 0
浮云: 543
在线等级:
注册时间: 2006-04-22
最后登陆: 2009-06-22

5come5帮你背单词 [ call /ko:l/ vt. 叫,喊,把…称呼为,打电话;vi. 叫,叫喊,访问,拜访;n. 叫,喊,访问,拜访 ]


Quote:
引用第11楼jon986cn于2007-11-09 13:47发表的  :
而且在你的例子中,内存里面放的当然是0xff,因为本来就是CPU完成转换后放入内存的

-1就是是 0xFF噻(2字节的类型就是0xFFFF),编译时就确定了,
顶端 Posted: 2007-11-09 13:51 | [13 楼]
jon986cn





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 486
威望: 0
浮云: 1143
在线等级:
注册时间: 2005-10-06
最后登陆: 2008-06-21

5come5帮你背单词 [ somewhere /'sΛmw/ə/ ad. 某处 ]


这不叫“通过不同的方式访问有不同的意义”。而是CPU经过处理后返回给你的啊,他都是同一个值。首先我要说明,内存里面永远存放的都是0xff,为什么?因为现代计算机广泛采用补码表示。而计算机根据你的需要返回时,要返回合法的值。
顶端 Posted: 2007-11-09 13:57 | [14 楼]
« 1 2» Pages: ( 1/2 total )
我来我网·5come5 Forum » 程序员之家

Total 0.016596(s) query 5, Time now is:01-09 12:30, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号