c语言无符号,有符号变量输出问题
我糊涂了。%x输出什么意思,为什么char变量,输出这么多%d输出,第二个为什么是-32,第三个怎么是224晕菜了,求大神挨个指点。谢谢了!...
我糊涂了。%x输出什么意思,为什么char变量,输出这么多
%d输出,第二个为什么是-32,第三个怎么是224
晕菜了,求大神挨个指点。谢谢了! 展开
%d输出,第二个为什么是-32,第三个怎么是224
晕菜了,求大神挨个指点。谢谢了! 展开
7个回答
展开全部
挺有意思的题目。逐条解释吧。
首先要明白char是按一个字节存储的,int是按4个字节的存储的,无符号数是和正数的符号位一样。
%x按4个字节打印十六进制(有符号),%d按4个字节打印十进制(有符号)。
第一个打印:要按4个字节的%x格式打印一个字节的char型,所以输出了这么多。
%d输出的第二个:要以有符号的格式%d输出一个无符号的数ic,所以会输出负数。
%d输出的第三个:要以有符号而且是4字节的格式%d输出一个无符号而且是一个字节的char型,所以得到224。
首先要明白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。
展开全部
首先 0xe0 十进制是 14*16=224 你用有符号的char 存储其实是存储了 224-256=-32
%x 输出的是十六进制数 其实是 -32的十六进制
%d 其实就是输出 -32
第三个是有符号 就是224 了
%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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
%x输出的是数据的16进制,%d输出的是整数。
追问
这个我知道。为什么输出是那样
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
32(十进制): 0000 0000 0000 0000 0000 0000 0010 0000(二进制) : 00000020 (十六进制)
-32: 1111 1111 1111 1111 1111 1111 1110 0000 : FFFFFFE0
-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语言。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
引用慧当领绝顶的回答:
挺有意思的题目。逐条解释吧。
首先要明白char是按一个字节存储的,int是按4个字节的存储的,无符号数是和正数的符号位一样。
%x按4个字节打印十六进制(有符号),%d按4个字节打印十进制(有符号)。
第一个打印:要按4个字节的%x格式打印一个字节的char型,所以输出了这么多。
%d输出的第二个:要以有符号的格式%d输出一个无符号的数ic,所以会输出负数。
%d输出的第三个:要以有符号而且是4字节的格式%d输出一个无符号而且是一个字节的char型,所以得到224。
挺有意思的题目。逐条解释吧。
首先要明白char是按一个字节存储的,int是按4个字节的存储的,无符号数是和正数的符号位一样。
%x按4个字节打印十六进制(有符号),%d按4个字节打印十进制(有符号)。
第一个打印:要按4个字节的%x格式打印一个字节的char型,所以输出了这么多。
%d输出的第二个:要以有符号的格式%d输出一个无符号的数ic,所以会输出负数。
%d输出的第三个:要以有符号而且是4字节的格式%d输出一个无符号而且是一个字节的char型,所以得到224。
展开全部
%x输出的是无符号十六进制数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询