| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2936 人关注过本帖
标题:初来乍到, 有问题请教
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
-1的十六进制表示正是全部F。你打开Windows内置的计算器,切换到程序员模式,键入十进制的-1(用1-2运算也可以)然后转换为十六进制看看就知道了。
在C中,只有0为假,非零为真。只要i-j≠0,if()判断就为真。

[ 本帖最后由 TonyDeng 于 2012-6-28 21:01 编辑 ]

授人以渔,不授人以鱼。
2012-06-28 20:59
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 9楼 TonyDeng
...
2012-06-28 21:33
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 11楼 TonyDeng
版主 你好,
1:请看题目: if(i-j>0)  i-j>0肯定是假 应该输出else的内容啊? 但是VC++运行结果却是1>2     而不是1<=2  ???
2:我在计算器里算了却是是FFFFFFFFFFFFFFF.我是这样分析的, -1 化成二进制是:10000001.然后二进制转十六进制是:0x81吧?  怎么是FFFFFFFFFFFFFFF呢???

2、在32为X86平台,下述代码输出结果是?
unsigned int i=1;
 unsigned int j=2;
 printf("0x%08x\n",i-j);
 if(i-j>0){
      printf("%d > %d", i , j);
 }else{
      printf("%d <= %d", i, j);
}

Many Thanks!
2012-06-28 21:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你觉得不服气就自己查书找答案呗,我认为不需要再多解释了,前面的已经说得很详细,看不看得懂是你的事。

授人以渔,不授人以鱼。
2012-06-28 21:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
前面已经过说,i-j的无符号整数结果是0xFFFFFFFF,这是正整数的极限大值,怎么不是>0?无符号整数,永远>=0,哪来的负数!
还有,负数的补码不是你这样算的,是所有高位均为1!

[ 本帖最后由 TonyDeng 于 2012-6-28 21:55 编辑 ]

授人以渔,不授人以鱼。
2012-06-28 21:54
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 14楼 TonyDeng
我没有说你回答的有问题. 而是我觉得有几个问题不太明白而已!
我已经反复看过理论书,但是没有我想要的结果.
所以找版主你高手指点.

1:if(i-j>0) 我认为是假. 但是实际却...

2:-1确实是得到FFFFFFFFFFFFFFF, 但是怎么转化的呢?

不懂就问,这才好学生.
Thanks.

2012-06-28 21:58
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 15楼 TonyDeng
版主,

第一点我已经明白了 if(i-j>0)  怎么回事.

关于第二点:  -1 转化二进制是: 10000001 吧. 你说高位补1  是怎么回事?
2012-06-28 22:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你定义unsigned int i, j,两个都是无符号整数,编译器的编译法则,对这样的数据类型运算结果也同样是unsigned int,因为其结果必然是大于等于零,只要i≠j,就是i-j>0为真,j-i>0也同样为真。这就是编程规范中告诫慎用unsigned类型的原因,尽量用signed类的,事实上,不是所有语言都有unsigned类型,无符号数据类型,不是通用的数据类型(换言之,要想得到移植性最大的程序,就不要使用unsigned数据类型)。

计算机的负数法则,事实就是所有高位为1,没得解,不要想当然,这是业界的现实。-2的二进制表示是11111110,10是2,左边6个高位均为1,不是你以为的最左边那个才是1。你想一想,现实中并非所有机器的数据单元均为8位,有人用4位二进制来解释-2的时候,你那个方案就会出错,而这种全部填1的方案才是能满足需求的。对32位整数,也同样是全部填1,非常非常大的一个负数,在32位机器输入错误时经常遇到的那种大负数就是这样来的。C程序员很多习惯用移位运算符来取代乘除运算的,这只有在unsigned int中有效,对signed int,就会得到错误的结果。所以结合前面的介绍,最好不要滥用移位运算。

[ 本帖最后由 TonyDeng 于 2012-6-28 22:20 编辑 ]

授人以渔,不授人以鱼。
2012-06-28 22:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
对-2这样小(绝对值)的负数,在8位范围检测0x80,固然最高位为1,但在16位范围内,检测0x8000,也同样得到最高位为1,扩展到32位、64位整数,都可以通过检测最高位是否为1来判断它是否负数。这样的事实表明,同样的一个负数,必然多处有1,并非只有最高位为1——事实是高位全部为1,这样,无论你用多少位来描述这个数,它都是负数。

授人以渔,不授人以鱼。
2012-06-28 22:34
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 18楼 TonyDeng
基本明白了.   

版主,
-1转化二进制是:11111111111111111111111111111111 32位. 就是32个1组成.   然后转化成16进制是FFFFFFFF 八个F.  但是计算器里计算出来是:16个F.    这是什么原因呢?
我查了我电脑是32位系统.


Thanks!
2012-06-28 22:46
快速回复:初来乍到, 有问题请教
数据加载中...
 
   



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

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