|
网站首页
|
业界新闻
|
小组
|
威客
|
人才
|
下载频道
|
博客
|
代码贴
|
在线编程
|
编程论坛
|
登录
注册
短消息
我发表的主题
我参与的主题
我收藏的贴子
我上传的附件
我下过的附件
编辑个人资料
我的博客
用户控制面板
搜索
道具
恢复默认风格
碧海青天
秋意盎然
棕红预览
粉色回忆
蓝雅绿
紫色淡雅
青青河草
e点小镇
橘子红了
红红夜思
水晶紫色
雪花飘飘
新年快乐
风格
短消息
论坛展区
帮助
编程论坛
→
开发语言
→
『 C语言论坛 』
→ 初来乍到, 有问题请教
我的收件箱(0)
欢迎加入我们,一同切磋技术
用户名:
密 码:
共有
2936
人关注过本帖
标题:
初来乍到, 有问题请教
只看楼主
加入收藏
TonyDeng
等 级:
贵宾
威 望:
304
帖 子:25859
专家分:48889
注 册:2011-6-22
第
11
楼
收藏
得分: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
等 级:
新手上路
帖 子:44
专家分:0
注 册:2012-6-27
第
12
楼
收藏
得分:0
回复 9楼 TonyDeng
...
2012-06-28 21:33
举报帖子
使用道具
赠送鲜花
wangchengbin
等 级:
新手上路
帖 子:44
专家分:0
注 册:2012-6-27
第
13
楼
收藏
得分: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
等 级:
贵宾
威 望:
304
帖 子:25859
专家分:48889
注 册:2011-6-22
第
14
楼
收藏
得分:0
你觉得不服气就自己查书找答案呗,我认为不需要再多解释了,前面的已经说得很详细,看不看得懂是你的事。
授人以渔,不授人以鱼。
2012-06-28 21:51
举报帖子
使用道具
赠送鲜花
TonyDeng
等 级:
贵宾
威 望:
304
帖 子:25859
专家分:48889
注 册:2011-6-22
第
15
楼
收藏
得分:0
前面已经过说,i-j的无符号整数结果是0xFFFFFFFF,这是正整数的极限大值,怎么不是>0?无符号整数,永远>=0,哪来的负数!
还有,负数的补码不是你这样算的,是所有高位均为1!
[
本帖最后由 TonyDeng 于 2012-6-28 21:55 编辑
]
授人以渔,不授人以鱼。
2012-06-28 21:54
举报帖子
使用道具
赠送鲜花
wangchengbin
等 级:
新手上路
帖 子:44
专家分:0
注 册:2012-6-27
第
16
楼
收藏
得分:0
回复 14楼 TonyDeng
我没有说你回答的有问题. 而是我觉得有几个问题不太明白而已!
我已经反复看过理论书,但是没有我想要的结果.
所以找版主你高手指点.
1:if(i-j>0) 我认为是假. 但是实际却...
2:-1确实是得到FFFFFFFFFFFFFFF, 但是怎么转化的呢?
不懂就问,这才好学生.
Thanks.
2012-06-28 21:58
举报帖子
使用道具
赠送鲜花
wangchengbin
等 级:
新手上路
帖 子:44
专家分:0
注 册:2012-6-27
第
17
楼
收藏
得分:0
回复 15楼 TonyDeng
版主,
第一点我已经明白了 if(i-j>0)
怎么回事.
关于第二点:
-1 转化二进制是: 10000001 吧. 你说高位补1
是怎么回事?
2012-06-28 22:04
举报帖子
使用道具
赠送鲜花
TonyDeng
等 级:
贵宾
威 望:
304
帖 子:25859
专家分:48889
注 册:2011-6-22
第
18
楼
收藏
得分: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
等 级:
贵宾
威 望:
304
帖 子:25859
专家分:48889
注 册:2011-6-22
第
19
楼
收藏
得分:0
对-2这样小(绝对值)的负数,在8位范围检测0x80,固然最高位为1,但在16位范围内,检测0x8000,也同样得到最高位为1,扩展到32位、64位整数,都可以通过检测最高位是否为1来判断它是否负数。这样的事实表明,同样的一个负数,必然多处有1,并非只有最高位为1——事实是高位全部为1,这样,无论你用多少位来描述这个数,它都是负数。
授人以渔,不授人以鱼。
2012-06-28 22:34
举报帖子
使用道具
赠送鲜花
wangchengbin
等 级:
新手上路
帖 子:44
专家分:0
注 册:2012-6-27
第
20
楼
收藏
得分:0
回复 18楼 TonyDeng
基本明白了.
版主,
-1转化二进制是:11111111111111111111111111111111 32位. 就是32个1组成.
然后转化成16进制是FFFFFFFF 八个F.
但是计算器里计算出来是:16个F.
这是什么原因呢?
我查了我电脑是32位系统.
Thanks!
2012-06-28 22:46
举报帖子
使用道具
赠送鲜花
65
2/7页
1
2
3
4
5
6
7
快速回复:
初来乍到, 有问题请教
数据加载中...
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by
Discuz
, Processed in 0.017029 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved