c语言无符号,有符号变量输出问题

我糊涂了。%x输出什么意思,为什么char变量,输出这么多%d输出,第二个为什么是-32,第三个怎么是224晕菜了,求大神挨个指点。谢谢了!... 我糊涂了。%x输出什么意思,为什么char变量,输出这么多

%d输出,第二个为什么是-32,第三个怎么是224

晕菜了,求大神挨个指点。谢谢了!
展开
 我来答
慧当领绝顶
2013-09-12 · TA获得超过139个赞
知道小有建树答主
回答量:100
采纳率:0%
帮助的人:90.5万
展开全部
挺有意思的题目。逐条解释吧。

首先要明白char是按一个字节存储的,int是按4个字节的存储的,无符号数是和正数的符号位一样。
%x按4个字节打印十六进制(有符号),%d按4个字节打印十进制(有符号)。

第一个打印:要按4个字节的%x格式打印一个字节的char型,所以输出了这么多。
%d输出的第二个:要以有符号的格式%d输出一个无符号的数ic,所以会输出负数。
%d输出的第三个:要以有符号而且是4字节的格式%d输出一个无符号而且是一个字节的char型,所以得到224。
更多追问追答
追问
是的,谢谢参与
追答
%x不分符号,是我写错了。
汗,写的很抽象,但收到一个赞成,看来有人看懂了!解释一下吧:

signed char sc = 0xe0;内存也保存为0xe0。

unsigned int ic = sc;这一句,把有符号的字符型赋给无符号的整型。计算机的操作是,先把sc扩充成四字节,有符号数扩充的方法是按照符号位来填满空缺部分,于是ic就变成了0xffff ffe0;然后有符号数变成无符号数,在内存中没变化,还是0xffff ffe0。

unsigned char uc = sc;这一句,把有符号字符型赋给无符号字符型。计算机的操作是,把内存中的sc值直接copy给uc,所以uc在内存中和sc一样,都是0xe0。

看%x的第一个打印,把0xe0扩充成四字节,有符号数扩充的方法是按照符号位来填满空缺部分,所以输出ffff ffe0。第二个打印,直接输出,没得说的。第三个打印,无符号数扩充,前面说了,无符号数看作和正数的符号位一样。全部用0填充,所以就是0x0000 00e0,0不打印,打印e0。

%d的输出和%x的值一样,只是形式不一样,不解释。

分析0xe0对应的十进制数:
因为0xe0的二进制是1110 0000,所以计算机存储的就是1110 0000,是按反码存储。首位是符号位,为1表示负数。因为负数的反码是对应原码按位取反再加1,那倒推,原码就是反码减1再按位取反。
好,首位的1先不管,110 0000减一得101 1111;按位取反得原码010 0000,而这个数的十进制就是32。所以对于有符号字符型,0xe0就是-32。
IT孤鹜
2013-09-12 · TA获得超过4198个赞
知道大有可为答主
回答量:3960
采纳率:71%
帮助的人:3579万
展开全部
首先 0xe0 十进制是 14*16=224 你用有符号的char 存储其实是存储了 224-256=-32
%x 输出的是十六进制数 其实是 -32的十六进制
%d 其实就是输出 -32

第三个是有符号 就是224 了
追问
-32的十六进制怎么来的?ic十六进制怎么输出这个?
追答
-32  0xffffffe0  这个很好算吧,
一个int占32位
32/4=8 所以必须要8个字符表示
又因为是负号,所以结果就是 1111 1111 1111 1111 1111 1111 1111 0100 0000
ic 是整数 所以是 0000 0000 0000 0000 0000 0000 1110 0000
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
昭君出九州春l
2013-09-12 · 贡献了超过196个回答
知道答主
回答量:196
采纳率:0%
帮助的人:46.2万
展开全部
%x输出的是数据的16进制,%d输出的是整数。
追问
这个我知道。为什么输出是那样
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Jacke_159
2013-09-12 · TA获得超过196个赞
知道小有建树答主
回答量:128
采纳率:100%
帮助的人:107万
展开全部
32(十进制): 0000 0000 0000 0000 0000 0000 0010 0000(二进制) : 00000020 (十六进制)
-32: 1111 1111 1111 1111 1111 1111 1110 0000 : FFFFFFE0
更多追问追答
追问
逐条解释吧
追答
十进制 到二进制  十六进制 这个进制转换 C语言基础 就是8421编码规则
至于正到负数 有很多方法,方法一: 比如: 从地位到高位, 遇到第一个 ‘1’ 开始, 原来是0就变成1,原来是1就变成0
比如 0010 0000 变成负数就是 1110 0000, 0010 0000的从低6位开始转变。
方法二: 通过补码加1也行。
。。。。。。。 详细看谭浩强的C语言。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
happy公孙皓
2017-12-26
知道答主
回答量:1
采纳率:0%
帮助的人:919
引用慧当领绝顶的回答:
挺有意思的题目。逐条解释吧。

首先要明白char是按一个字节存储的,int是按4个字节的存储的,无符号数是和正数的符号位一样。
%x按4个字节打印十六进制(有符号),%d按4个字节打印十进制(有符号)。

第一个打印:要按4个字节的%x格式打印一个字节的char型,所以输出了这么多。
%d输出的第二个:要以有符号的格式%d输出一个无符号的数ic,所以会输出负数。
%d输出的第三个:要以有符号而且是4字节的格式%d输出一个无符号而且是一个字节的char型,所以得到224。
展开全部
%x输出的是无符号十六进制数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式