| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 517 人关注过本帖
标题:这道题输出多少,求理由
只看楼主 加入收藏
xzy199999
Rank: 4
等 级:业余侠客
帖 子:326
专家分:286
注 册:2010-11-19
结帖率:92.45%
收藏
已结贴  问题点数:15 回复次数:7 
这道题输出多少,求理由
unsigned short A = 10;
printf("~A = %u\n", ~A);

char c=128;
printf("c=%d\n",c);

输出多少?并分析过程
搜索更多相关主题的帖子: 输出 
2010-12-10 15:19
落拓
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:58
专家分:173
注 册:2010-9-29
收藏
得分:5 
我的机子的unsigned short 是2个字节。16位。
A=10 的存储形式为 0000 0000 0000 1010  进行~A,取反后为 1111 1111 1111 0101.接着的那个printf就是输出这个数的十进制形式,就是:4294967285(无符号输出)。
 char 是1个字节,8位。十进制的127 在二进制中表示为 0111 1111 。128为,1000 0000 。这个数在有符号的情况下,是个负数,刚好是-128。
printf("c=%d\n",c); 的输出就是-128。若楼主的 char c=128; 改成 char c=129.此时,其二进制形式为 1000 0001 。 在有符号时,这个数是-127 。
2010-12-10 17:26
xzy199999
Rank: 4
等 级:业余侠客
帖 子:326
专家分:286
注 册:2010-11-19
收藏
得分:0 
1000 0000 再有符号的情况下1代表负,后面是0,不应该是-0 =0么?
1000 0001怎么会变成-127呢,不是应该-1吗?

我是初学者
2010-12-10 17:41
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:7 
short是在内存中占有两个字节
那么10在内存中的表示就是  0101 0000   0000 0000(从左到右算)
这个没有问题吧那么  ~A就是把这些二进制数按位取反
就变成了                  1010 1111   1111 1111(从左到右算)
如果按照%u的形式输出  那么这个16位的数就变成了32位  那么前16位是这样了
后面的16位系统会自动全部填上1(具体为什么我也不知道,只能这样认为才能解释输出结果,
可能是%u的问题吧)然后就变成了1010 1111   1111 1111   1111 1111   1111 1111(从左到右算)
那么这个数是多少?  如果是32个1那是4294967295(2的32次方减一)  现在这个数就是4294967285
所以第一个输出应该是4294967285

char c=128;
printf("c=%d\n",c);
第二个char c=128; 首先会把128的ASC码赋值给c   c的二进制就是0000 1000
你把C按照%d形式输出 和上面的道理一样都是填1 C的二进制就会变成 1111 1111 0000 1000
那么这个二进制就是-128   好累啊

 

                                         
===========深入<----------------->浅出============
2010-12-10 17:48
xzy199999
Rank: 4
等 级:业余侠客
帖 子:326
专家分:286
注 册:2010-11-19
收藏
得分:0 
回复 4楼 laoyang103
这位大哥,感谢你回复了这么多,可是我还是不能理解啊,不都是从左边到右边么,你这2进制的怎么从右边往左边读取啊?
还有128的2进制不是1000,0000么,然后转为整型最高位的1变成负号,应该是-0啊,你怎么说是0000,1000?我是越看月糊涂鸟~

我是初学者
2010-12-10 18:00
xiaomarn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:348
专家分:2026
注 册:2009-3-18
收藏
得分:3 
第一个取反了,然后按无符号打出
第二个char c=128(10000000),符号扩展了
楼主的题,每个都好有水平啊!

2010-12-10 18:02
落拓
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:58
专家分:173
注 册:2010-9-29
收藏
得分:0 
回复 3楼 xzy199999
楼主对补码,原码不想很懂吧。计算机存储的是数字的补码。正数的补码和其二进制形式是一样的。所以,+128的补码为 1000 0000。补码的出现是为了直接在对两个数相加,就好像读小学时,我们做加法那样,列出来。+ 128 + (-128)必须等于0 所以 -128 为 1000 0000。就这样。
2010-12-10 22:15
xzy199999
Rank: 4
等 级:业余侠客
帖 子:326
专家分:286
注 册:2010-11-19
收藏
得分:0 
回复 7楼 落拓
1000,0000不是128吗,怎么又变成-128了?

我是初学者
2010-12-11 15:39
快速回复:这道题输出多少,求理由
数据加载中...
 
   



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

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